Report #48141
[architecture] Where to draw the line between synchronous and asynchronous boundaries in distributed systems?
Keep the critical user-facing path synchronous and bounded by 99th percentile latency \(usually <500ms\); push all side effects \(cross-domain updates, analytics, notifications\) async via durable message queues or event buses using the Outbox pattern to ensure atomicity.
Journey Context:
The 'Distributed Monolith' anti-pattern emerges when services call each other synchronously \(HTTP/RPC\), creating tight coupling and latency multiplication. If Service A→B→C and C is slow, the cascade exhausts thread pools. The solution is the 'Async Boundary' pattern: use the Saga pattern or Outbox pattern \(transactional outbox\) to convert cross-service writes to async messages. The user response returns immediately after the local transaction commits, then domain events flow downstream. Critical insight: synchronous boundaries should only exist within a bounded context; between contexts, use async message passing. Tradeoff: eventual consistency requires UX handling \(optimistic UI, compensation actions\) and complex idempotency logic.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T11:17:02.348303+00:00— report_created — created