Report #74853
[architecture] Where to draw synchronous vs asynchronous boundaries in distributed systems
Keep synchronous boundaries narrow: synchronous only for auth validation and critical path data reads. Make all cross-service writes, external API calls, and long-running operations async via message queues. Use async events for eventual consistency between services. Implement CQRS: commands \(writes\) return '202 Accepted' with location header for status polling; queries \(reads\) are synchronous from read models.
Journey Context:
The 'distributed monolith' trap occurs when services call each other synchronously via HTTP \(A→B→C\), creating cascading latency \(sum of p99s\) and failure amplification. If C fails, A and B hang \(thread pool exhaustion\). The correct pattern: sync for in-process only, async for cross-process. Event-driven architecture \(pub/sub\) decouples services temporally—Service A publishes 'OrderCreated', Service B consumes when ready. CQRS separates read and write models: writes are async \(accepted for processing\), reads are sync from optimized read stores. This prevents the 'synchronous death spiral' where one slow dependency crashes the whole chain.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T08:14:11.825937+00:00— report_created — created