SQS vs SNS vs EventBridge: Choosing a Messaging Service

5 min read

As soon as you start splitting services, one question arrives immediately: should this message go to SQS, SNS, or EventBridge? The conclusion up front: a buffer that holds work for a single consumer is SQS; pushing the same message to multiple subscribers at once is SNS; and routing by event content, SaaS integrations, or scheduling means EventBridge. And in practice the right answer is often a combination rather than a single pick. Prices are for us-east-1.

Side-by-side comparison #

SQSSNSEventBridge
ModelQueue (1:1)Pub/sub (1:N push)Event bus (rule routing)
DeliveryConsumer pollsPushed to subscribersRule match → target invocation
Retention4 days default, 14 maxNone (only delivery retries)None (archive is a separate feature)
OrderingFIFO queuesFIFO topicsNone
Price (per million)~$0.40 (FIFO $0.50)~$0.50 per publish~$1.00 for custom events

The models: who takes the message, and when does it disappear #

SQS is a queue. Producers put messages in; consumers poll, process, and delete them. If a consumer dies, messages stay in the queue (4 days by default, up to 14). A message being processed is hidden from other consumers for the visibility timeout and reappears if processing fails. With the retry machinery that moves repeatedly failing messages to a DLQ (dead-letter queue), the whole service is optimized for never losing a piece of accepted work. Absorbing traffic spikes as queue depth is its day job.

SNS is pub/sub. Publish to a topic and every subscriber gets an immediate push. Subscribers range from SQS queues, Lambda, and HTTP endpoints to email and mobile push, and filter policies let each subscriber receive only what it cares about. The key constraint: there is no retention. A failed delivery is retried per the retry policy and then gone, and a subscriber added later cannot receive past messages.

EventBridge is an event bus. Publishers throw events onto the bus without knowing who consumes them; receivers write rules that match on the event’s JSON content and get only matching events. Three things set it apart: AWS service events flow into the default bus automatically (S3, EC2, and the rest), it accepts SaaS partner events (Datadog, Stripe, and others), and it comes with archive/replay plus a scheduler (a cron replacement). Targets span more than 20 types, including Lambda, SQS, and Step Functions.

Pricing: the billing unit matters more than the unit price #

  • SQS: about $0.40 per million requests (FIFO $0.50), with the first million free each month. Requests are counted in 64KB chunks, so one 256KB message bills as 4 requests. Also, polling an empty queue at short intervals counts toward requests too — long polling (WaitTimeSeconds 20) should be your default.
  • SNS: about $0.50 per million publishes, first million free monthly. Delivery to SQS and Lambda is free; HTTP delivery adds about $0.60 per million.
  • EventBridge: about $1.00 per million custom events — the most expensive of the three, with no free tier. In exchange, AWS service events arriving on the default bus are not billed. Billing is likewise in 64KB units.

All three land around $1 per million, so at ordinary scale price is not the deciding variable. It starts to matter in the hundreds of millions of events, where the 2.5x gap between EventBridge and SQS shows up directly on the bill.

Combination patterns: connect them, don’t pick one #

  • SNS → SQS fan-out: publish an order event to an SNS topic, and let the payment, shipping, and notification services each subscribe with their own SQS queue. You get fan-out (SNS) and a loss-proof buffer (SQS) at once — this is the most common textbook pattern. Even with a consumer down, messages pile up safely in its queue.
  • EventBridge → SQS: rule-filtered events land in a queue so consumers control their own pace. This is the standard shape for pipelines processing S3 events.
  • Lambda as the trigger target: all three can invoke Lambda directly, and for event-driven workloads the compute-side decision follows exactly the criteria in Lambda vs Fargate.

Traps to filter out #

  • EventBridge latency: an event takes roughly half a second on average to travel through rules to its target. Keep it out of the synchronous path of a user request.
  • Critical messages on bare SNS: with no retention, messages vanish for as long as a subscriber is down. Anything you cannot afford to lose must have SQS behind it.
  • FIFO throughput limits: FIFO queues default to 300 messages/sec (3,000 with batching). High-throughput mode raises that, but the first question is whether total ordering is really required across all messages — per-message-group ordering is usually enough.
  • Large payloads: all three cap at 256KB. Put files and large JSON in S3 and carry only the key in the message — the pointer pattern is the standard, and thanks to 64KB-chunk billing it is also cheaper.

Selection order #

  1. Check whether there is a single receiver: if the shape is “stack up work, let the consumer process at its own pace,” SQS ends the discussion. Background jobs, batch feeding, and spike absorption live here.
  2. If several parties need the same message, put SNS in front: fan-out with an SQS queue per subscriber is the base form.
  3. If routing depends on event content, it’s EventBridge: field-value conditions, AWS service events, SaaS integrations, scheduling, or archive/replay — any one of these puts you here.
  4. Sanity-check latency and ordering: as a rule, none of the three belongs in a synchronous path, and if you need ordering, check the FIFO throughput ceiling along with it.
  5. Price by billing unit: 64KB chunks, polling request counts, and HTTP delivery surcharges are what produce the real bill. Also make sure no unused subscriptions or rules linger (standing checklist).

Summary #

  • A work buffer for one consumer is SQS; fan-out to many subscribers is SNS; content-based routing, SaaS integration, and scheduling are EventBridge.
  • Retention, retries, and DLQs exist only in SQS. Whatever the topology, messages you cannot lose should end at an SQS queue.
  • Prices run about $0.40 (SQS), $0.50 (SNS), and $1.00 (EventBridge) per million, billed in 64KB chunks. The gap only matters at very high volume.
  • EventBridge adds roughly half a second of latency, so keep it out of synchronous paths. FIFO defaults to 300 messages/sec (3,000 batched).
  • The practical answer is a combination: SNS → SQS fan-out and EventBridge → SQS are the two most common shapes.
X