Report #104678
[architecture] Choosing sync vs async boundaries between services
Default to async \(event-driven\) for service-to-service communication unless you need a real-time response from the called service. Keep sync only for: user-facing query/response \(e.g., API gateway to backend\), operations where the caller cannot proceed without the result, and within the same process/thread. Use async for: commands \(fire-and-forget\), long-running tasks, and updates that can tolerate seconds of latency. The correct boundary is defined by the user's need: if the user waits, use sync; if the user doesn't, use async.
Journey Context:
Common anti-pattern: making everything async for 'scalability' even when the user is staring at a loading spinner — you just made debugging harder without benefit. The real tradeoff is complexity: sync is simple but creates temporal coupling \(if downstream fails, upstream fails\). Async decouples but introduces eventual consistency, dead-letter handling, and observability gaps. The 'sync vs async' decision should align with your availability requirements: use sync for strong consistency, async for high availability. A practical rule: start with sync, add async only when you measure blocking calls causing latency spikes or cascading failures.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-09-27T20:05:55.053687+00:00— report_created — created