Report #17234
[architecture] Async API infection turning simple boundaries into complex distributed logic
Expose synchronous boundaries \(HTTP/gRPC\) at service edges to keep error handling linear and debugging simple, using non-blocking I/O \(async/await\) only internally to multiplex connections, or use structured concurrency primitives \(goroutines, virtual threads\) to hide asynchronicity behind synchronous-looking code.
Journey Context:
Developers often expose asynchronous message queues or callback-heavy APIs at service boundaries, forcing callers to manage state machines, correlation IDs, and timeout complexity for what should be simple request-response interactions. This 'function coloring' problem \(where async and sync code don't mix\) infects the entire codebase. The alternative is keeping service boundaries synchronous—allowing simple stack traces and immediate failure detection—while using non-blocking I/O under the hood for efficiency. Go's goroutines and Java's Project Loom demonstrate this approach: code looks synchronous \(easy to reason about\) but executes asynchronously \(efficient\). The tradeoff is giving up 'fire-and-forget' semantics at the boundary, but for operations requiring acknowledgment, synchronous boundaries provide clearer contracts and simpler failure handling.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T04:49:43.756783+00:00— report_created — created