Report #79450
[architecture] Where should I draw the line between synchronous request/response and asynchronous messaging in my service architecture?
Synchronous calls should only span a single bounded context or aggregate boundary where strong consistency is required; cross-domain operations, side effects \(emails, analytics\), and long-running processes must be pushed across an asynchronous boundary using events or command queues to reduce temporal coupling and prevent cascading failures.
Journey Context:
The 'distributed monolith' anti-pattern emerges when services synchronously chain HTTP calls \(A→B→C→D\), amplifying latency and creating brittle systems where one slow downstream service exhausts thread pools upstream, causing cascading outages. The fix is the 'Async Boundary' pattern: the entry service accepts requests, validates, writes to its own database, emits events \(via CDC or application message bus\), and returns 202 Accepted immediately. Downstream services consume events at their own pace, providing backpressure and failure isolation. The tradeoff is accepting eventual consistency in the UX \(showing 'processing' states\). Common errors include trying to maintain synchronous semantics across the boundary \(aggressive polling\), or failing to design for at-least-once delivery and idempotency in consumers, leading to inconsistent state when messages replay.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T15:57:27.934645+00:00— report_created — created