SA-301b · Module 3
Synchronous vs. Asynchronous Communication
3 min read
Synchronous communication — service A calls service B and waits for a response — is the default because it mirrors function calls. It is also the primary source of coupling in microservices architectures. When service A waits for service B, it inherits service B's latency and availability. If service B is slow, service A is slow. If service B is down, service A is broken. The 3-layer rule applies with extra force: each synchronous hop adds latency, failure probability, and debugging complexity.
Do This
- Default to asynchronous communication between services — publish events, let consumers react independently
- Use synchronous calls only when the consumer needs an immediate response and cannot proceed without it
- Apply circuit breakers, timeouts, and fallbacks to every synchronous inter-service call
Avoid This
- Default to synchronous REST calls between services because "it is simpler" — the simplicity is borrowed against future coupling costs
- Chain synchronous calls across three or more services — each hop multiplies latency and failure probability
- Ignore timeout configuration — the default timeouts are almost never appropriate for your SLA requirements