Service Bus vs Storage Queues vs Event Grid vs Event Hubs
Verdict: Commands that must land exactly once go on Service Bus. Reactive triggers go on Event Grid. Streaming with replay goes on Event Hubs. Storage Queues only for queues over 80 GB or when an audit trail is required.
| Criterion | Service Bus | Storage Queues | Event Grid | Event Hubs |
|---|---|---|---|---|
| Semantics | Commands; at-least-once delivery, at-most-once processing | Simple async jobs | Discrete events, push or pull | Streaming log, replay by offset |
| Max message | 256 KB Standard; 100 MB Premium | 64 KB | Event envelope, not payload transport | Event batches, throughput-unit metered |
| Ordering and dedup | Sessions (FIFO), duplicate detection, transactions, DLQ | None; at-least-once only | No ordering guarantee | Per-partition ordering |
| Retention or replay | TTL up to 14 days | Up to 7 days | 24-hour push retry window | 7 days Standard; 90 days Premium and Dedicated |
| Choose when | Order, payment, reservation flows | Queue may exceed 80 GB; audit trail needed | Azure resource change triggers; consumer behind Private Link uses pull | Kafka migration without code changes; telemetry backfill |
Rules
- Choose Service Bus for command workloads: peek-lock, duplicate detection, transactions and a built-in dead-letter queue come only there.
- Choose Service Bus Premium when messages exceed 256 KB (up to 100 MB), or VNet isolation and geo-disaster recovery are required.
- Choose Storage Queues above 80 GB or for audit trails; individual messages cap at 64 KB.
- Choose Event Hubs to retire Kafka clusters: existing clients repoint to its Kafka endpoint without code changes.
- Choose Event Grid pull delivery when the consumer cannot expose a public endpoint or must connect over Private Link.
- Publish CloudEvents 1.0 for cross-vendor interoperability; the Event Grid schema is proprietary.
Traps
- 256 KB is the Service Bus Standard limit, not the Storage Queues limit - Storage Queues cap at 64 KB.
- Event Hubs Standard caps replay at 7 days; Capture to Blob is not in-stream retention. A 30-day replay window needs Premium or Dedicated.