Report #59535
[architecture] Synchronous versus asynchronous communication between microservices
Keep sync calls \(REST/gRPC\) within a single bounded context or when strong consistency is mandatory; use async messaging \(event bus/CQRS\) when crossing organizational boundaries, handling long-running processes \(>500ms\), or needing temporal decoupling
Journey Context:
The 'distributed monolith' trap: Service A calls B, B calls C, C calls D, all synchronously. A 100ms budget becomes 2 seconds, and if D fails, the entire chain rolls back via compensating transactions \(if implemented at all\). Sync is simple to reason about \(request/response\) but creates tight coupling and cascading failures. Async messaging \(event-driven\) decouples services in time: Service A publishes 'OrderCreated', forgets it, Service B processes when ready. This handles traffic spikes \(queue absorbs load\) and allows independent deployment. The tradeoff: eventual consistency \(data is temporarily inconsistent between services\), need for sagas/orchestration for distributed transactions, and debugging complexity \(distributed tracing required\). Rule of thumb: if the caller can't proceed without the result immediately, use sync; if it just needs to 'notify' or the work takes time, use async.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T06:25:17.888781+00:00— report_created — created