Sooner or later, every team building on AWS hits the same fork in the road: two services need to talk asynchronously, and you have to choose between Amazon SQS and Apache Kafka.
The usual framing is "SQS is simple, Kafka is powerful." That's true, but it hides the difference that actually matters:
SQS is a queue. A consumer takes a message, processes it, deletes it.
Kafka is a log. Messages stay for as long as you configure, and every consumer keeps its own bookmark.
Once you see it that way, the choice gets a lot easier.
SQS in 30 seconds
SQS is fully managed: no brokers, no partitions, no disks to size. Producers send, consumers poll, and a received message stays hidden for the visibility timeout. Delete it in time and it's gone for good; crash, and it reappears for another worker.
aws sqs send-message --queue-url $QUEUE_URL \ --message-body '{"orderId": 4821, "total": 59.90}' aws sqs receive-message --queue-url $QUEUE_URL \ --max-number-of-messages 10 --wait-time-seconds 20 # delete only after the work really succeeded aws sqs delete-message --queue-url $QUEUE_URL --receipt-handle $HANDLE - Standard queues: at-least-once delivery, best-effort ordering, practically unlimited throughput.
- FIFO queues: strict ordering per message group plus 5-minute deduplication, at lower throughput.
- Retention: 1 minute to 14 days, then SQS drops the message.
Kafka in 30 seconds
Kafka writes messages to topics split into partitions, which are append-only files. Reading doesn't delete anything; consumers just move an offset.
# billing and analytics read the same topic with independent offsets kafka-console-consumer.sh --bootstrap-server localhost:9092 \ --topic orders --group billing kafka-console-consumer.sh --bootstrap-server localhost:9092 \ --topic orders --group analytics --from-beginning That last part is the superpower SQS doesn't have. Add a fraud-detection service six months from now and it can read every order still in retention, without the producer changing a line.
Quick comparison
| Amazon SQS | Apache Kafka | |
|---|---|---|
| Model | Queue, deleted after processing | Log, retained with offsets |
| Operations | Fully run by AWS | You, or MSK / Confluent Cloud |
| Many consumers, same message | Needs SNS fan-out to several queues | Built in via consumer groups |
| Replay | No | Yes, reset offsets |
| Ordering | None (Standard) / per group (FIFO) | Per partition |
| Pricing | Per request, 1M free/month | Per broker or cluster hour + storage |
Pick SQS when...
- Each message is a job: resize an image, send an email, generate a PDF. Once it's done, nobody needs it again.
- You want zero ops. Wire it to Lambda and AWS handles polling, batching and scaling. Failures go to a dead-letter queue with one redrive policy.
- Traffic is low or spiky. An idle queue costs close to nothing (just turn on long polling so empty receives don't add up).
Pick Kafka when...
- The same event matters to many systems: billing, inventory, search, the data warehouse. Each is just another consumer group.
- You need replay. A buggy consumer wrote bad data for two days? Fix it and rewind only that group:
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \ --group analytics --topic orders \ --reset-offsets --to-datetime 2026-10-01T00:00:00.000 --execute - You're doing event sourcing, CDC with Debezium, or stream processing with Kafka Streams / Flink.
The cost nobody puts in the table
Self-hosted Kafka is real work: sizing brokers, picking partition counts up front, watching consumer lag, handling upgrades. Amazon MSK removes the servers, but you still pay for brokers running 24/7, and a small multi-AZ cluster lands in the hundreds of dollars a month before storage. For a three-person team shipping a SaaS app, that gap versus an idle SQS queue is significant.
If you want a replayable log but prefer to stay AWS-native, Kinesis Data Streams sits in the middle: multiple consumers, up to 365 days of retention, no brokers, but without Kafka's ecosystem.
The one-question rule
After a message is processed, does anything ever need to read it again?
- No → start with SQS.
- Yes, or several independent systems consume the same events → Kafka.
And plenty of teams run both: Kafka carries core business events between services, while SQS queues at the edges handle the jobs those events trigger.
📖 Want the full breakdown? The complete guide covers FIFO vs Standard queues, MSK pricing, Kinesis, and a detailed FAQ: Kafka vs Amazon SQS: Which Messaging Service Is Better? on Online ToolKit Hub.
Working with message payloads? Check out the free tools at onlinetoolkithub.com to format and validate JSON right in your browser.
Which one does your team use, and why? Let me know in the comments 👇
![Why Object.keys(user) Returns string[], Not (keyof User)[]: TypeScript Means It](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2q4w48b9bzs43tynyhsf.png)
