Synchronous vs Asynchronous Communication
Whether the caller waits for the callee's answer — decided by whether the caller's outcome depends on it, not by latency or taste.
The test: does this user action succeed or fail based on this callee's response? If yes, synchronous; you need the answer to decide. If no, asynchronous; waiting buys nothing and costs you the callee's availability.
Synchronous makes the caller's availability the product of every callee's — four dependencies at 99.9% cap you near 99.6% — makes latency additive including the tail, and forces the caller to handle partial failure mid-sequence.
Asynchronous decouples availability and latency, and charges eventual consistency, harder end-to-end debugging, and the need for idempotent consumers, dead letter queues and replay. It also converts "the user sees an error now" into "the user sees success and something goes wrong later", which is sometimes the worse outcome.
The option people forget sits between them: synchronous request, asynchronous completion —
accept the work, return 202 Accepted with a status URL or a webhook, complete out of band. That
keeps the caller's contract honest while removing the work from the critical path.