Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Microservices rules: what good looks like

Chris Richardson
January 23, 2024
6.5k

Microservices rules: what good looks like

The microservice architecture has become increasingly popular over the past decade. Its key benefits include significantly improving the developer experience and accelerating software delivery. Sadly, however, microservices have often been widely misunderstood and used inappropriately. As a result, many organizations have struggled to benefit from their adoption.

In this presentation I'll describe 11 software development and architecture rules (a.k.a. best practices) that should prevent an organization from making a mess of its microservice architecture.

Chris Richardson

January 23, 2024
Tweet

More Decks by Chris Richardson

Transcript

  1. @crichardson Microservices rules: what good looks like Chris Richardson Founder

    of Eventuate.io Founder of the original CloudFoundry.com Author of POJOs in Action and Microservices Patterns @crichardson [email protected] http://adopt.microservices.io Copyright © 2024. Chris Richardson Consulting, Inc. All rights reserved
  2. @crichardson “Our application is ‘****’, it's so complex and so

    dif fi cult to change” Architect of ancient legacy application Developer of a young microservices application
  3. @crichardson Presentation goal 11 rules that prevent an organization from

    making a mess of its microservice architecture
  4. @crichardson Agenda Development rules A really brief overview of software

    architecture Rule: use a rational design process Architecture rules Rule: Track and improve software metrics and KPIs
  5. @crichardson O VID -19 https://www.ft.com/content/f9356bdc-3102-11ea-a329-0bcf87a328f2 https://www.ft.com/content/3f498e64-1aa6-11ea-97df-cc63de1d73f4 https://techcrunch.com/2019/06/18/the-rise-of-the-gig-economy-helps-london-based-insurtech-zego-to-raise-42m/ The success triangle

    Process: DevOps/Continuous Delivery & Deployment Organization: Network of small, loosely coupled, product teams IT must deliver software rapidly, frequently, reliably and sustainably Businesses must be nimble, agile and innovate faster S/W VUCA Architecture: ??? Enables Enables
  6. What is DevOps? Set of principles and practices where developers,

    testers (dev) and IT operations (ops) collaborate and communicate to deliver software rapidly, frequently, and reliably http://itrevolution.com/devops-handbook Three ways Flow Feedback Learning
  7. @crichardson About continuous delivery/ deployment The ability to get changes

    into production safely and quickly in a sustainable way. Code (Git) repository is the source of truth Software is always releasable Developers commit frequently - e.g. daily - to trunk Highly automated
  8. @crichardson Rule #2: Implement a fast deployment pipeline Production Fast,

    automated deployment pipeline Developer laptop Application repository 15 minutes
  9. High performance organization: team of teams Small - 5-9 people

    - promotes productivity and trust Long-lived - enables trust and high performance Cross-functional: requirements -> deployed code Typically owns suitably sized software “component” Promotes long-term sustainable development Prevents cognitive overload Component: Business capability Platform that accelerate delivery of components https://teamtopologies.com/key-concepts
  10. @crichardson “Developer experience (DevEx) encompasses how developers feel about, think

    about, and value their work.” https://queue.acm.org/detail.cfm?id=3595878
  11. @crichardson DevEx framework DevEx Work environment than minimizes interruptions, meaningful

    work, … Minimize - simplify environment, automate, good documentation, … Fast feedback from colleagues, tools, deployment pipeline, production, users, … Feedback Flow Cognitive load https://queue.acm.org/detail.cfm?id=3595878 Great
  12. @crichardson Agenda Development rules A really brief overview of software

    architecture Rule: use a rational design process Architecture rules Rule: Track and improve software metrics and KPIs
  13. @crichardson About software architecture “The software architecture of a computing

    system is the set of structures needed to reason about the system, which comprise software elements, relations among them, and properties of both.” Documenting Software Architectures, Bass et al Development • Maintainability • Testability • Deployability • … Nonfunctional requirements Runtime • Scalability • Performance • Availability • … Satis fi es Architecture Focus
  14. @crichardson How to organize subdomains into components to meet these

    requirements? External behavior Business logic/ capability
  15. @crichardson Microservice architecture: two or more components Production Deployment pipeline

    Service Repo Deployment pipeline Service Repo Deployment pipeline Service Repo Independently deployable Loosely coupled Svc Svc Svc
  16. @crichardson Agenda Development rules A really brief overview of software

    architecture Rule: use a rational design process Architecture rules Rule: Track and improve software metrics and KPIs
  17. Rational vs. Irrational decision making Irrational @FamousDev says X is

    good/bad X looks like a cool, new thing to try X would look good on my resume I’ve used X in my past 5 jobs Magical thinking: we can neglect architecture … 
 Rational 1. Understand your context 2. Understand your problem 3. De fi ne the evaluation criteria 4. Identify candidate solutions 5. Evaluate solutions wrt. criteria 6. Pick the best solution 7. Document using an ADR https://microservices.io/post/architecture/2023/03/13/better-decision-making-with-patterns.html Requires knowledge Only you know this
  18. @crichardson Spectrum of design decisions What to build vs. what

    to buy? Monolith or microservice architecture? If microservices => what’s the service architecture: APIs, responsibilities, and collaboration? How to deploy services? Which message broker to use? … Big Small
  19. @crichardson Architectural requirement: loose coupling Order Management Customer Management Develops

    Develops Unaffected by changes to the other Conway’s law Loosely coupled = work independently Loosely coupled Degree of design-time coupling = probability of lockstep changes
  20. @crichardson Loose coupling is a fundamental principle of software design

    Ignore at your peril! of classes, packages, modules, services, applications, … V
  21. @crichardson Architectural requirements: testability and deployability Production Automated deployment pipeline

    >= 1 commit / developer / day Must be fast running Must be reliable Must be testable using automated tests deployment Must be locally testable commit
  22. @crichardson Architectural requirements distilled into dark energy and dark matter

    Subdomain A «Aggregate» X Subdomain B «Aggregate» Y Service A Service B Attraction Simple interactions Efficient interactions Prefer ACID over BASE Minimize runtime coupling Minimize design time coupling Simple components Team autonomy Fast deployment pipeline Support multiple technology stacks Segregate by characteristics Repulsion Dark energy Dark matter Metaphor for Metaphor for … SystemOperation() Generates Forces that act on subdomains and determine grouping into services
  23. @crichardson Dark energy forces: reasons to use microservices https://microservices.io/post/architecture/2023/03/26/dark-energy-dark-matter-force-descriptions.html Service

    Service «Subdomain» A «Aggregate» X «Subdomain» B «Aggregate» Y Simple components Team autonomy Fast deployment pipeline Support multiple technology stacks Segregate by characteristics Repulsive dark energy forces Characteristics: • Resource requirements • Regulations, e.g. SaMD/PCI • Business criticality/tier • Security, e.g. PII, … • DDD core/supporting/generic • ...
  24. @crichardson But your context determines relevance of dark energy forces

    to you Force: reason to use microservices What determine relevance to your application Team autonomy ∝Number of teams Fast deployment pipeline Build time ∝ size/complexity of app Build frequency ∝ rate of Git pushes Multiple technology stacks Need multiple technologies? Segregate by characteristics Business criticality Have high availability subdomains? Regulations Regulated subdomains? …
  25. @crichardson IF you have this DevEx… Large monolith • High

    cognitive load • Less autonomy • More meetings • Slow feedback Single classpath, Large code base, Slow deployment pipeline, … Simple (e.g. ACID txns) development BUT You
  26. @crichardson …THEN adopt microservices to have this DevEx Service Small

    part of a large application Service … Service … Service … collaborators A P I • Less cognitive load • More autonomy incl. technical • Less meetings • Faster feedback You A P I A P I A P I Service … Service … clients
  27. How many services? MICROservices != little services Excessively fi ne-grained,

    overly complex architectures are far too common A service should exist to solve a tangible problem https://microservices.io/post/antipatterns/2019/05/21/antipattern-more-the-merrier.html https://premium.microservices.io/a-service-should-exist-to-solve-a-problem/
  28. @crichardson Fine-grained architecture: risk of poor DevEx Right-sized Service A

    P I Fine- grained Service API Good ✅ Bad ❌ Focus on collaboration logic Focus on domain logic
  29. @crichardson Dark matter forces: reasons NOT to distribute subdomains https://microservices.io/post/architecture/2023/03/26/dark-energy-dark-matter-force-descriptions.html

    Subdomain A «Aggregate» X Subdomain B «Aggregate» Y Service A Service B Simple interactions Efficient interactions Prefer ACID over BASE Minimize runtime coupling Minimize design time coupling Attractive dark matter forces SystemOperation() Generates
  30. @crichardson Designing an architecture = making trade-offs Con fl icting

    forces Therefore Some services/ operations will have an optimal design Others will be suboptimal but good enough Subdomain A «Aggregate» X Subdomain B «Aggregate» Y Service A Service B Attraction Simple, efficient interactions Prefer ACID over BASE Minimize runtime coupling Minimize design time coupling Simple components Team autonomy Fast deployment pipeline Support multiple technology stacks Segregate by characteristics Repulsion Dark energy Dark matter Metaphor for Metaphor for Fine-grained services Monolith
  31. @crichardson Assemblage: an architecture de fi nition process that’s powered

    by dark energy and dark matter* https://microservices.io/post/architecture/2023/02/09/assemblage-architecture-de fi nition-process.html Subdomain A «Aggregate» X Subdomain B «Aggregate» Y Service A Service B Dark energy Dark matter * metaphor overload
  32. @crichardson Agenda Development rules A really brief overview of software

    architecture Rule: use a rational design process Architecture rules Rule: Track and improve software metrics and KPIs
  33. @crichardson Architecture rules #6 Design loosely coupled services #7 Design

    independently deployable services #8 Design testable services #9 Develop observable services #10 Incrementally migrate from a monolith to microservices De fi ning characteristics of microservices
  34. Rule #6: Design loosely (design-time*) coupled services * vs runtime

    and build-time coupling https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html Customer Service Customer Subdomain Order Service Order Subdomain API Stable Infrequent lock step changes
  35. The problem with tight design- time coupling Changing services in

    lock step reduces productivity: API changes/evolution Complexity of non-atomic changes of independently deployable services Coordination between teams Worst case: distributed monolith! Therefore: Tightly coupled subdomains should be packaged together Order Service Customer Subdomain Order Subdomain Package together
  36. Design iceberg services Implementation DB API Small, stable API Large,

    complex implementation Change https://microservices.io/post/architecture/2023/03/01/geometry-of-microservices.html
  37. @crichardson Rule #7: design independently deployable services https://microservices.io/post/architecture/2022/05/04/microservice-architecture-essentials-deployability.html Production Order

    Service Order Service Deployment pipeline Test in isolation Test Service Test Double Service Sole criteria for release Includes contract- testing to enforce API interoperability Deploy automatically
  38. @crichardson Why independently deployable services? De fi ning characteristic of

    the microservice architecture Testing a service in isolation Simpler testing set up using test doubles Fast Reliable Testing services together = distributed monolith = downsides of both with few of the bene fi ts By de fi nition: the output of a deployment pipeline is deployable
  39. @crichardson Rule #8: Design testable services Automated - tests must

    be automated Fast - tests must execute quickly to provide fast feedback Reliable - tests must not be fl aky: failing test = real problem Locally executable - tests must run on a developer's laptop to provide fast feedback. Isolated - tests must use test doubles for the service's dependencies
  40. @crichardson The testing pyramid and microservices Unit Integration Includes consumer-driven

    contract tests Component End to End Classes within service A services adapters An entire service Multiple services or application Services are independently deployable
  41. @crichardson Rule #9: develop observable services Key Health check invoker,

    e.g. monitoring service Invokes Observable Service Health Check API Health Check API pattern Log file Logging server Log aggregation pattern Exception Reporter Exception Tracking Service Exception Tracking pattern Audit Database Adapter Audit Logging pattern Metrics Exporter Metrics service Application Metrics pattern Distributed Tracing Exporter Distributed tracing server Distributed tracing pattern Logging Aggregation Pipeline Logging Adapter Pattern Developer responsibility Operations responsibility Auditing Database Pattern Participant
  42. Why observable services? (Fast) feedback is a foundation of DevEx

    and DevOps Quickly detect, diagnose and fi x production issues http://itrevolution.com/devops-handbook Flow Feedback Learning
  43. @crichardson Rule #10: Incrementally migrate from a monolith to microservices

    Monolith Time Monolith Service Monolith Service Service Monolith Service Service Service Service …. Monolith Service Service Service Service Service Service Service Service Service Service Service Service Service Service Service Service …. Strangler application The strangler application grows larger over time The monolith shrinks over time Service Service Service Service Service Service Service Service New features
  44. Why is the Strangler Fig application pattern better than a

    big bang rewrite? Acknowledges that modernization is a process of discovery Immediate bene fi t from services Enables agility Early and continuous feedback and learning https://microservices.io/post/refactoring/2023/06/21/strangler- fi g-application-pattern-incremental-modernization-to-services.md.html
  45. @crichardson Agenda Development rules A really brief overview of software

    architecture Rule: use a rational design process Architecture rules Rule: Track and improve software metrics and KPIs
  46. @crichardson Track DORA metrics Deployment frequency - how frequently changes

    are pushed to production Lead time - time from commit to deploy Change failure rate - how frequently a change breaks production Time to restore service - how long to recover from a failed deployment https://dora.dev/
  47. @crichardson Statistical averages hide what good looks like Deployment frequency

    - for each commit Lead time - under an hour Change failure rate - really low Time to restore service - really short https://dora.dev/
  48. @crichardson Order Service Git Repository Customer Service Git Repository Evaluating

    design-time coupling: analyzing Git commits JIRA issue Implement X Git commit Git commit Frequent lock-step changes indicate tight design-time coupling
  49. Measure directly: frequency of breaking API changes Quanti fi ed:

    Interval between breaking API changes % commits Subjective: Never Rarely … Often Service Dependency Client API change Pass thru API change Impacts clients Impacts service
  50. @crichardson Evaluating design-time coupling: metrics Service Surface area/API complexity #

    Inbound dependencies Number of operations Number of events Number/Complexity of objects/relationships Client API Degree of exposure = API Complexity / Implementation Complexity Complexity of dependency # Outbound dependencies Number of operations Number of events Number/Complexity of objects/relationships Dependency Dependencies Transitive Dependency Transitive Client
  51. Organizational KPIs Software delivery performance impacts business success → Every

    leader including CxOs should pay attention Category KPI Delivery Lead time Deployment frequency DevEx Perceived ease of delivery Perceived productivity Architecture Degree of loose design-time coupling
  52. Summary: microservices rules Development rules Continuously deliver/deploy Implement fast, automated

    deployment pipelines Organize into small, autonomous, loose-coupled teams Provide a great developer experience (DevEx) Architecture rules Design independently deployable services Design loosely coupled services Design testable services Develop observable services Incrementally migrate from a monolith to microservices Rule: Track and improve software metrics and KPIs Rule: Use a rational design process