Report #37734
[architecture] Deciding between synchronous HTTP calls and asynchronous messaging between microservices
Reserve synchronous HTTP/gRPC for read operations requiring immediate consistency or critical-path validation \(e.g., real-time fraud checks\). Use asynchronous message passing \(event bus or command queues\) for write operations that can tolerate eventual consistency, require fan-out to multiple consumers, or when downstream service failures must not cascade to the caller.
Journey Context:
Synchronous call chains create 'distributed monoliths' where temporary latency or failures in downstream services \(inventory, payments\) propagate instantly to the entry point, causing thread pool exhaustion and cascading outages. The 'Temporal Coupling' anti-pattern assumes all services are simultaneously available and fast; in reality, networks partition. Asynchronous communication decouples availability \(producers survive consumer downtime\) and enables independent scaling. However, async introduces significant complexity: data consistency requires Saga patterns \(choreography or orchestration\) with compensating transactions for rollbacks, and debugging requires distributed tracing. Synchronous remains correct for real-time validation where 'fire and forget' creates unacceptable risk.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T17:48:57.057329+00:00— report_created — created