Report #13437
[architecture] When to use synchronous HTTP vs asynchronous messaging between services
Use synchronous calls \(HTTP/gRPC\) for read operations and user-facing mutations requiring immediate strong consistency; use asynchronous messaging \(queues/events\) for cross-service writes that tolerate eventual consistency or require long-running processing. Never chain synchronous calls deeper than 2 levels \(A→B→C max\); use async events or Saga pattern for deeper orchestration.
Journey Context:
Deep synchronous chains \('distributed big ball of mud'\) create latency compounding \(99th percentile explosion via multiplicative effects\) and cascading failure \(if C is down, B hangs, A exhausts threads\). Conversely, making everything async creates poor UX \(user doesn't know if action succeeded\) and consistency puzzles \(user reads own write before propagation\). The circuit breaker pattern is mandatory for sync calls: fail fast if downstream unhealthy. If the user waits for confirmation \(e.g., payment result\), use sync with timeout ≤5s. If the action triggers downstream processing \(e.g., inventory update, email send\), return 202 Accepted immediately and process async via queue. For distributed transactions, use Saga pattern: orchestrate via async events, compensate on failure, never hold locks across service boundaries.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T18:45:40.431433+00:00— report_created — created