System Design Space
Knowledge graphSettings

Updated: June 24, 2026 at 6:44 PM

Why microservices and integration are needed

easy

Introductory chapter on service boundaries, domain decomposition, API contracts, synchronous and asynchronous interaction, service discovery, and operational integration risks.

Microservices are useful not as an architectural status symbol, but as a way to align domain boundaries, team structure, and responsibility.

In real design work, the chapter shows that the choice between a monolith, a modular monolith, and services starts with boundaries, contracts, latency, and integration cost rather than transport or platform choice.

In interviews and engineering discussions, it gives language for discussing coupling, blast radius, degradation paths, and schema drift before the first remote call exists.

Practical value of this chapter

Design in practice

Define service boundaries and interface ownership before choosing transport or concrete tooling.

Decision quality

Compare integration options by coupling, latency, blast radius, and operating effort.

Interview articulation

Show the reasoning chain: context, contract, failure risks, and evolution path.

Failure framing

Design degradation up front for network splits, timeout cascades, and schema drift.

Context

Building Microservices

The reference practical source: where to draw service boundaries, how to hold contracts, and how architecture can evolve without pain.

Читать обзор

The Microservices and Integration section is here so a distributed system reads as a coherent set of services rather than an accidental dependency graph no one holds in their head at once. Success here is measured not by service count, but by the quality of boundaries, the discipline of contracts, and how well the integration decisions are thought through.

The chapter ties system design to what actually happens in production: choosing an interaction model, running the API lifecycle, and keeping a single dependency failure from turning into a cascading one.

Why this section matters

Integration defines the real complexity of distributed systems

Many incidents in a distributed system happen not inside a service but at the seams: a mismatched contract, a bad retry, an expired timeout, an incompatible schema change. That is where production pain is waiting.

Without clear boundaries microservices buy you nothing

With no bounded contexts and no clear ownership, a set of services slides into a distributed monolith: coupling stays high, but you can no longer deploy each part on its own — the worst of both worlds.

Communication model selection drives architectural trade-offs

Picking synchronous over asynchronous interaction is really a choice across four axes at once: latency, consistency, debugging effort, and operating cost. Reversing it later is expensive, so decide it deliberately.

API contracts define delivery speed

Versioning policy, backward compatibility, and API lifecycle discipline are what let teams release independently. Break a contract without warning and independent releases turn into coordinated downtime.

This competence is mandatory for senior system design

In interviews and in production alike, engineers are expected not to draw diagrams for their own sake but to justify service boundaries and integration choices through concrete risks and constraints.

How to go through microservices and integration step by step

Move from boundaries to operations: define service ownership, map interaction flows, lock contracts, build in reliability, and finish with governance rules for integration changes.

Active step 1/5

Service boundaries and ownership

Start from the domain and team ownership: a service should map to a clear business capability, own its data, and have an explicit change boundary.

What to check

  • Business capabilities, bounded contexts, data ownership, and team responsibility areas.
  • Change frequency, release independence, team dependencies, and distributed-monolith risk.

Practice

  • Service boundary map with data and interface owners.
  • Ownership matrix for services, APIs, events, and operational signals.

Self-check questions

  • Which team owns change and operations for this service?
  • Which boundary reduces coupling, and which one only moves coupling into the network?

Mistake this catches

Splitting services by technical layers and ending up with a distributed monolith instead of autonomous boundaries.

Key integration trade-offs

Sync simplicity vs async resilience

Synchronous calls are easier to read and debug, but any network failure in a dependency hits the caller immediately. The async model absorbs the blow — the price is distributed debugging and consistency that arrives later, not now.

Shared database convenience vs service autonomy

A shared database speeds up early delivery but turns the schema into an implicit contract among every reader. Separate data ownership gives autonomy back — and you pay for it in integration complexity and duplication.

Strong consistency vs availability and velocity

Every step toward strong consistency is paid for in latency and lost flexibility when you scale. Before demanding strong consistency, check whether the business scenario actually needs it.

Central platform vs team autonomy

A central integration platform removes chaos, but only works with mature self-service, transparent SLAs and clear contracts. Without those it becomes the bottleneck every team has to pass through.

What this section covers

Service boundaries and decomposition

Where architecture starts: where to draw boundaries, how to apply domain-driven design (DDD), and how to leave the monolith without landing in a distributed one.

Integration and API operations

How services talk in production: communication patterns, API lifecycle management, and the practices that keep integration from cascading into failure.

How to apply this in practice

Common pitfalls

Cutting the system along technical layers instead of business capabilities and bounded contexts — the boundaries end up technical while the coupling stays in the business.
Making everything synchronous and adding no retries, timeouts or circuit breakers at the boundaries — the first dependency failure turns into a cascade.
Putting off API lifecycle management: without versioning, backward compatibility and contract testing, every release breaks the neighbors.
Leaving a shared database in place for good instead of treating it as a transitional migration state.

Recommendations

Draw service boundaries through domain ownership and change frequency — not org charts or code package layout.
Separate synchronous and asynchronous scenarios explicitly and write down how the system behaves under dependency degradation before the fire, not during it.
Embed contract testing, schema governance and changelog discipline straight into the CI/CD pipeline.
Capture integration trade-offs in ADRs: consistency level, latency impact, operational complexity and platform cost — so later it is clear what you chose and why.

Section materials

Where to go next

Lock boundaries and contracts first

Start with Decomposition Strategies and Learning DDD, then continue with Building Microservices — so service boundaries stop being a hypothesis and become a durable model.

Strengthen integration delivery discipline

Move next to Inter-service Communication, EIP and Continuous API Management: they give a systematic apparatus for API evolution and interaction reliability, not one-off tricks.

Related chapters

Enable tracking in Settings