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