System DesignMedium
What is the difference between Azure Service Bus and Storage Queues?
Both are Azure queueing services but solve different problems.
Azure Storage Queues
- Simple FIFO-ish queue (no strict ordering guarantees)
- Up to 80 GB total / 64 KB per message
- HTTP polling API
- ~$0.0005 per 10K operations
- No publish-subscribe, no transactions
var queue = new QueueClient(conn, "orders");
await queue.SendMessageAsync(JsonSerializer.Serialize(order));
await foreach (var msg in queue.ReceiveMessagesAsync()) {
Process(msg);
await queue.DeleteMessageAsync(msg.MessageId, msg.PopReceipt);
}
Good for: simple work queues, decoupling a background worker from an HTTP API, "I just need messages out of process".
Azure Service Bus
- Enterprise messaging with AMQP support
- Topics + subscriptions (pub/sub)
- Sessions (FIFO per-key)
- Transactions, dead-letter, scheduled delivery
- Up to 80 GB total / 256 KB per message (1 MB Premium)
- ~$0.05 per million operations (Basic tier)
var sender = client.CreateSender("orders");
var msg = new ServiceBusMessage(JsonSerializer.Serialize(order)) {
SessionId = order.CustomerId.ToString(),
ScheduledEnqueueTime = DateTimeOffset.Now.AddMinutes(5)
};
await sender.SendMessageAsync(msg);
Good for: enterprise integration, saga choreography, ordered processing per partition, fan-out via topics.
Decision table:
| Need | Storage Queue | Service Bus |
|---|---|---|
| Cheap, simple | ✓ | ✗ |
| Pub/sub (topics) | ✗ | ✓ |
| Strict FIFO per key | ✗ | ✓ (sessions) |
| Transactions | ✗ | ✓ |
| Dead-letter | manual | built-in |
| Scheduled delivery | ✗ | ✓ |
| Message size > 64 KB | ✗ | ✓ |
| AMQP integration | ✗ | ✓ |
Rule of thumb: start with Storage Queues. Upgrade to Service Bus when you need pub/sub, sessions, or transactional messaging. The Service Bus tier is overkill for a simple work queue but indispensable when business processes span multiple services.