Report #80606
[architecture] Choosing between synchronous RPC and asynchronous messaging between services
Default to asynchronous messaging \(fire-and-forget or pub/sub\) when services can tolerate eventual consistency and need temporal decoupling. Reserve synchronous RPC \(HTTP/gRPC\) only for operations requiring immediate confirmation or read-after-write consistency across boundaries.
Journey Context:
Teams often default to REST HTTP calls between services because they mirror in-process method calls, but this creates dangerous temporal coupling: if Service B is down, Service A fails immediately, and retry logic creates cascading latency. The insight from Enterprise Integration Patterns and Sam Newman's 'Building Microservices' is that sync boundaries should be the exception, not the rule. Use async messaging when: \(1\) the operation can complete eventually \(email sending, inventory updates\), \(2\) you want the sender to proceed without waiting for the receiver \(latency insulation\), and \(3\) you can handle eventual consistency in your UX. Use sync RPC only when: \(1\) the user needs immediate confirmation \(payment authorization\), \(2\) you need read-after-write consistency across services \(just updated profile, immediately read profile\), or \(3\) the operation is truly atomic and blocking. The 'distributed monolith' smell occurs when you have async communication but require synchronous coordination \(saga orchestration\) without accepting eventual consistency.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T17:53:57.269955+00:00— report_created — created