Synchronous communication blocks the caller until a response arrives; asynchronous communication sends a message and continues without waiting. Each makes different trade-offs in coupling, latency, and resilience.
Synchronous communication blocks the caller until a response arrives; asynchronous communication sends a message and continues without waiting. Each makes different trade-offs in coupling, latency, and resilience.
| Aspect | Synchronous (REST/gRPC) | Asynchronous (messaging) |
|---|
| Caller waits? | Yes | No |
| Temporal coupling | Tight | Loose |
| Resilience to outages | Low | High (broker buffers) |
| Consistency | Immediate | Eventual |
| Complexity | Lower | Higher |
| Debuggability | Easier (linear) | Harder (flows) |
SYNC: Caller ──request──▶ Service
Caller ◀─response── Service (blocked the whole time)
ASYNC: Caller ──message──▶ [ Queue ] ──▶ Service
Caller continues immediately; Service handles it later
Async hides failures — a dropped or poison message can silently break a workflow. You need dead-letter queues and monitoring.
The choice directly controls how failures propagate: sync calls fail fast and visibly, async messages decouple but defer problems to consumers.
Mixing them well — sync at the edge, async for workflows — is a core skill in building resilient microservices.