Async Patterns vs Sync: When Each Wins
Async is sold as performance medicine; the right answer is more nuanced. Sync wins more often than people think.
Sync vs async basics
Sync: request → response in same call.
Async: request → queue → eventual processing → notification.
Different shapes; different tradeoffs.
Four-criteria split
- 1. Time-to-result tolerance.
- 2. Throughput requirements.
- 3. Failure-handling needs.
- 4. Operational complexity tolerance.
Queue patterns
Sync: simple; debuggable; failure mode is ‘error.’
Async: high throughput; resilient to spikes; failure mode is ‘eventual completion (or not).’
Operational cost
Async adds: queue infrastructure; consumer monitoring; DLQ handling; idempotency.
Real cost: 1-2 engineer-quarters of investment per major async path.
Antipatterns
- Async for everything. Operational complexity exceeds value.
- Sync where async would help. Backpressure cascades.
- Async without DLQ. Lost work.
What to do this week
Three moves. (1) Apply this pattern to your slowest production endpoint. (2) Measure p99 before/after. (3) Document the win and ship the runbook so the team can reproduce.