Data as of Sep 14, 2026 · Based on 339 AI responses from ChatGPT Search and Google AI Mode · See how Parse measures this
Selecting a message queue depends on your specific architectural requirements. Use RabbitMQ for complex, flexible routing and low-latency needs. Choose
Apache Kafka for high-throughput event streaming and logs. Opt for managed services like AWS SQS or
Google Cloud Pub/Sub if you want to minimize operational maintenance and infrastructure setup.
Brands AI recommends here
Named in 79% of answers
Best for high-throughput event streaming, event sourcing, and durable logs. It is highly performant for data-heavy scenarios, though it is typically a self-hosted solution that involves significant overhead.
Named in 78% of answers
Best for complex routing and flexible delivery patterns. It provides powerful reliability and support for varied messaging styles but requires more hands-on operational management than cloud-native alternatives.
Named in 72% of answers
Best for teams prioritizing ease of use, lower maintenance, and quick setup. As a managed cloud service, it handles scaling automatically but lacks the advanced routing versatility of RabbitMQ.
Named in 39% of answers
Choosing a message queue or event broker for a microservices architecture is a foundational decision that impacts system throughput, latency, data integrity, and operational complexity. Here is a structured, step-by-step framework to help a back-end developer evaluate and choose the right tool: 1. **Analyze the…
Choosing a message queue or event broker for a microservices architecture is a foundational decision that impacts system throughput, latency, data integrity, and operational complexity.
Here is a structured, step-by-step framework to help a back-end developer evaluate and choose the right tool:
If you'd like, let me know:
I can recommend specific tools that match your stack.
A good way to choose a message queue is to start with **messaging semantics and workload**, not with the technology you already know. ## 1. First decide what kind of messaging you need Ask:
A good way to choose a message queue is to start with messaging semantics and workload, not with the technology you already know.
Ask:
This distinction eliminates many candidates immediately.
For example, Kafka is particularly suited to event streaming: topics can have multiple consumer groups, events are retained rather than deleted immediately after consumption, and partitions provide scalable parallelism while preserving ordering within a partition.
By contrast, RabbitMQ is often a better fit for traditional task/message-oriented workflows where routing, acknowledgements, retries, and consumer flow control are central concerns.
Don't simply ask vendors whether they support "exactly once." Define what your application actually requires:
| Requirement | Questions to ask |
|---|---|
| At-most-once | Can losing a message be tolerated? |
| At-least-once | Can consumers safely process duplicates? |
| Ordering | Must messages be processed in order? Globally or per entity? |
| Deduplication | How are duplicate messages detected? |
| Replay | Can a consumer go back and process old events? |
| Durability | What happens if brokers/nodes fail? |
In practice, at-least-once + idempotent consumers is often the most useful design. RabbitMQ, for example, can requeue unacknowledged messages after consumer failure, so consumers need to tolerate redelivery.
Similarly, Amazon SQS standard queues provide at-least-once delivery and can deliver duplicates, whereas FIFO queues provide ordering and deduplication mechanisms.
Estimate:
Don't optimize for today's traffic alone.
For example, if you have:
50,000 events/sec → 20 independent consumers → need to replay events from yesterday you're probably looking at a streaming platform such as Kafka rather than a conventional work queue.
If you have:
500 jobs/sec → workers process each job once → retry failed jobs → dead-letter failed messages a conventional queue such as RabbitMQ or SQS may be much simpler.
Ordering is frequently over-specified.
Instead of saying:
"All orders must be processed globally in order." you may actually need:
"Events for the same
order_idmust be processed in order." That distinction can dramatically improve scalability.
Kafka, for example, guarantees ordering within a partition; using an appropriate key lets related events go to the same partition while other keys can be processed concurrently.
SQS FIFO similarly supports message groups, allowing independent groups to maintain ordering without forcing the entire queue into one global sequence.
A production queue should give you good answers to:
Also consider backpressure. RabbitMQ, for example, supports consumer acknowledgements and prefetch limits so consumers don't get overwhelmed with unprocessed messages.
This is often more important than raw performance.
Ask:
A technically superior queue that your team cannot operate reliably is usually a worse choice.
A rough starting point:
| Technology | Good fit |
|---|---|
| Kafka | High-volume event streaming, replay, analytics, many independent consumers |
| RabbitMQ | Traditional messaging, complex routing, task queues, acknowledgements |
| Amazon SQS | Simple managed queues, especially on AWS |
| Azure Service Bus | Managed enterprise messaging in Azure |
| Google Pub/Sub | Managed pub/sub and event-driven systems on GCP |
| Redis Streams | Lower-complexity streaming when Redis is already central to the architecture |
These aren't absolute rules. For example, Kafka can handle task processing, and SQS can support pub/sub patterns when combined with other AWS services.
One of the hardest microservice problems isn't choosing Kafka vs. RabbitMQ—it is reliably doing:
UPDATE database
+
PUBLISH event
without ending up with one succeeding and the other failing.
For important domain events, investigate the transactional outbox pattern:
Service
|
+----> Database transaction
| |
| +-- business data
| +-- outbox event
|
+----> Relay publishes outbox event
|
v
Queue
|
+---------+---------+
v v
Service A Service B
This often matters more to correctness than which broker you ultimately select.
I'd make the decision in this order:
A common mistake is starting with "Should we use Kafka or RabbitMQ?".
A better question is:
"What guarantees does our application need, what workload will the broker handle, and what operational complexity are we willing to own?" Once those are clear, the technology choice is usually much easier.
UPDATE database
+
PUBLISH event
without ending up with one succeeding and the other failing.
For important domain events, investigate the transactional outbox pattern:
Service
|
+----> Database transaction
| |
| +-- business data
| +-- outbox event
|
+----> Relay publishes outbox event
|
v
Queue
|
+---------+---------+
v v
Service A Service B
This often matters more to correctness than which broker you ultimately select.
I'd make the decision in this order:
A common mistake is starting with "Should we use Kafka or RabbitMQ?".
A better question is:
"What guarantees does our application need, what workload will the broker handle, and what operational complexity are we willing to own?" Once those are clear, the technology choice is usually much easier.
A back-end developer should choose a message queue by first identifying **the communication pattern and guarantees the system needs**, not by picking the most popular technology. In microservices, a queue is not just a transport layer—it defines failure handling, ordering, scalability, and operational complexity. A…
A back-end developer should choose a message queue by first identifying the communication pattern and guarantees the system needs, not by picking the most popular technology. In microservices, a queue is not just a transport layer—it defines failure handling, ordering, scalability, and operational complexity.
A practical selection process:
Example:
Characteristics:
Good fits:
RabbitMQ is commonly chosen for task distribution and flexible routing, while SQS is attractive when you want a managed queue with minimal infrastructure ownership.
Example:
OrderCreatedUserRegisteredPaymentCompletedCharacteristics:
Good fits:
Kafka is designed around a durable, replayable event log, making it a strong choice when multiple systems need to consume the same history of events.
Example:
Consider:
Good fits:
Do not introduce a broker just because you have microservices. Synchronous communication is often the simpler choice when you need an immediate response.
| Requirement | Questions to ask |
|---|---|
| Throughput | Are you processing thousands, millions, or billions of messages? |
| Latency | Do you need sub-millisecond response or is seconds acceptable? |
| Ordering | Must events be processed in strict order? |
| Delivery | At-most-once, at-least-once, or exactly-once expectations? |
| Replay | Do consumers need to reread old messages? |
| Retention | Should messages disappear after consumption? |
| Routing | Do you need complex rules for where messages go? |
| Operations | Can your team operate clusters reliably? |
| Cloud strategy | Managed service or self-hosted? |
| Technology | Usually best for | Avoid when |
|---|---|---|
| Kafka | Event streams, analytics pipelines, event sourcing, high volume | You only need a simple job queue |
| RabbitMQ | Background jobs, workflows, routing-heavy messaging | You need massive event replay pipelines |
| Amazon SQS | AWS-native asynchronous jobs | You need complex streaming semantics |
| Redis Streams | Lightweight internal streams | You need mission-critical durable messaging at large scale |
| NATS | Low-latency service messaging | You need long-term event storage |
A common mistake is choosing based only on performance.
For example:
Ask:
"What failure mode am I trying to solve?" Examples:
No queue gives you magic reliability. A good microservices design usually includes:
Choose:
The best architecture often uses more than one messaging technology: for example, a queue for background jobs and an event stream for business events. The key is choosing based on the guarantees your system requires rather than trying to standardize everything on one tool.
Ask:
"What failure mode am I trying to solve?" Examples:
No queue gives you magic reliability. A good microservices design usually includes:
Choose:
Choosing the right message queue (or event broker) for a microservices architecture comes down to matching your system's specific **data flow patterns**, **consistency requirements** , and **operational constraints**. Here is a structured framework to guide your decision-making process: - **Messaging Paradigm (Queuing…
Choosing the right message queue (or event broker) for a microservices architecture comes down to matching your system's specific data flow patterns, consistency requirements , and operational constraints.
Here is a structured framework to guide your decision-making process:
If you want, tell me:
I can give you a direct comparison between specific tools like RabbitMQ and Kafka based on your needs.
A back-end developer should choose a message queue by **matching the architectural pattern (task queue vs. event streaming vs. pub/sub) to the specific data flow, throughput requirements, and delivery guarantees** of the microservices . Rather than looking for a universal tool, the selection depends on whether…
A back-end developer should choose a message queue by matching the architectural pattern (task queue vs. event streaming vs. pub/sub) to the specific data flow, throughput requirements, and delivery guarantees of the microservices . Rather than looking for a universal tool, the selection depends on whether services need point-to-point task distribution, historical log replay, or broad event broadcasting.
Core Evaluation Criteria
Architectural Comparison of Popular Options
| Broker / System | Primary Use Case | Delivery Model | Retention / Replay |
|---|---|---|---|
| RabbitMQ | Complex routing, task queues, background jobs | Point-to-point & Fan-out via Exchanges | Deleted after acknowledgment |
| Apache Kafka | Event sourcing, high-throughput streaming, audit logs | Publish-Subscribe (Partitioned Logs) | Retained for configured time/size |
| AWS SQS | Cloud-native simple background decoupling | Competing Consumers (Queue-based) | Retained up to retention window |
| Redis Streams | Low-latency, lightweight real-time data feeds | Pub/Sub & Consumer Groups | Configured memory/trim limits |
Decision Workflow for Back-End Teams
If you can share:
I can recommend the most practical message broker for your stack.
Choosing a message queue for a microservices architecture is less about picking the “best” broker and more about matching the broker’s **delivery model, ordering, scalability, and operational characteristics** to your workload. ## 1. Start with the workload, not the technology Ask:
Choosing a message queue for a microservices architecture is less about picking the “best” broker and more about matching the broker’s delivery model, ordering, scalability, and operational characteristics to your workload.
Ask:
These answers usually narrow the choices dramatically.
This is one of the most important distinctions.
Good for work distribution:
Order Service
|
v
Queue
/ | \
v v v
Worker Worker Worker
Each message is generally processed by one worker.
Typical examples:
Better when multiple independent consumers need to see the same events:
+--> Analytics
|
Order Service --> Kafka --> Billing
|
+--> Notifications
Kafka's consumer-group model supports both load balancing among consumers in a group and independent consumption by different groups.
So don't automatically reach for Kafka just because you're building microservices.
The common choices are:
For most microservices, at-least-once + idempotent consumers is a very practical design.
For example:
PaymentRequested(order_id=123)
Consumer receives it
|
v
Has order 123 already been charged?
/ \
yes no
| |
ignore charge card
|
v
record result
RabbitMQ's acknowledgements, for example, provide at-least-once semantics when consumers acknowledge only after completing the required work.
Similarly, standard Amazon SQS provides at-least-once delivery and explicitly expects applications to tolerate duplicates.
Ask what actually needs to be ordered.
Often you don't need:
Every message in the entire system must be globally ordered. You need:
Events concerning the same customer/order/account must be ordered. That's a much easier requirement.
Kafka, for example, guarantees ordering within a partition rather than globally across all partitions. You can partition by an entity such as customer_id or order_id to preserve ordering for that entity while retaining parallelism.
SQS FIFO similarly supports ordered message groups, allowing independent groups to be processed in parallel.
A useful starting point:
| Technology | Particularly good for | Watch out for |
|---|---|---|
| Kafka | Event streaming, high throughput, replay, multiple consumers | Operational complexity, partition design |
| RabbitMQ | Traditional messaging, routing, commands/jobs, flexible exchanges | Large-scale event-stream use cases may favor Kafka |
| Amazon SQS | Simple AWS-native asynchronous jobs and decoupling | Less flexible than a full event-streaming platform |
| Google Pub/Sub | Managed pub/sub at Google Cloud scale | Cloud-specific architecture |
| Azure Service Bus | Managed enterprise messaging on Azure | Azure coupling |
| NATS | Lightweight, fast service-to-service messaging | Different feature/retention model from Kafka |
For example, SQS standard queues emphasize very high throughput and simple asynchronous work distribution, while FIFO queues trade some throughput characteristics for ordering and deduplication features.
A production queue should make these scenarios manageable:
Consumer crashes
↓
Message becomes available again
↓
Retry
↓
Still failing?
↓
Dead-letter queue
↓
Alert / investigate
Look for:
Don't evaluate only the happy path.
A self-hosted Kafka cluster and a managed SQS queue are radically different operational commitments.
Ask:
A very good rule is:
If messaging isn't a competitive advantage for your product, prefer the simplest managed service that satisfies your requirements. For example, if you're running on AWS and simply need:
API → background worker
SQS may be a better architectural choice than introducing Kafka.
The broker isn't going to solve distributed-systems problems for you.
I'd establish conventions such as:
{
"event_id": "01J...",
"event_type": "OrderCreated",
"version": 1,
"occurred_at": "2026-09-05T08:00:00Z",
"aggregate_id": "order-123",
"payload": {}
}
And design consumers to be:
Need messaging?
|
v
Is it primarily jobs?
/ \
yes no
| |
Managed queue Multiple consumers?
(SQS etc.) / \
no yes
| |
RabbitMQ Event stream?
|
+-----+-----+
| |
yes no
| |
Kafka Pub/Sub
That's intentionally simplified—cloud environment, throughput, ordering, retention, and team expertise can change the answer.
Choose SQS / a managed queue when you mostly need reliable asynchronous work.
Choose RabbitMQ when you need sophisticated traditional message routing and queue semantics.
Choose Kafka when events themselves are an important durable data stream—particularly when you need high throughput, multiple independent consumers, partition-based ordering, or the ability to replay events.
And regardless of the broker, design around at-least-once delivery and idempotency unless you have a very specific reason not to.
The biggest mistake is choosing Kafka/RabbitMQ/etc. first and then designing the architecture around whatever semantics the technology happens to provide. Start with delivery, ordering, retention, fan-out, throughput, and failure requirements, then choose the simplest broker that satisfies them.
Need messaging?
|
v
Is it primarily jobs?
/ \
yes no
| |
Managed queue Multiple consumers?
(SQS etc.) / \
no yes
| |
RabbitMQ Event stream?
|
+-----+-----+
| |
yes no
| |
Kafka Pub/Sub
That's intentionally simplified—cloud environment, throughput, ordering, retention, and team expertise can change the answer.
Choose SQS / a managed queue when you mostly need reliable asynchronous work.
Choose RabbitMQ when you need sophisticated traditional message routing and queue semantics.
Choose Kafka when events themselves are an important durable data stream—particularly when you need high throughput, multiple independent consumers, partition-based ordering, or the ability to replay events.
And regardless of the broker, design around at-least-once delivery and idempotency unless you have a very specific reason not to.
The biggest mistake is choosing Kafka/RabbitMQ/etc. first and then designing the architecture around whatever semantics the technology happens to provide. Start with delivery, ordering, retention, fan-out, throughput, and failure requirements, then choose the simplest broker that satisfies them.
Choosing a message queue or event broker for a microservices architecture is one of the most consequential architectural decisions you'll make. It dictates how your systems scale, how they handle failures, and how tightly coupled your services remain. Here is a structured, step-by-step framework to help back-end…
Choosing a message queue or event broker for a microservices architecture is one of the most consequential architectural decisions you'll make. It dictates how your systems scale, how they handle failures, and how tightly coupled your services remain.
Here is a structured, step-by-step framework to help back-end developers evaluate and choose the right tool.
Different queues support different messaging models. Determine what your microservices actually need to do:
Analyze your system's operational constraints against these technical dimensions:
Consider your team's size, infrastructure maturity, and operational overhead:
To ground this decision, look at how popular tools map to these criteria:
To finalize your choice, answer these three questions with your team:
If you'd like to narrow this down, tell me:
No sources cited
A good back-end developer should choose a message queue based on **messaging semantics first, operational constraints second, and technology familiarity third**. ## 1. Start with the workload Ask these questions before comparing products:
A good back-end developer should choose a message queue based on messaging semantics first, operational constraints second, and technology familiarity third.
Ask these questions before comparing products:
Those answers usually narrow the choices dramatically.
Don't select a queue because it advertises "reliable messaging." Define what reliability means for your application.
The broker may deliver a message more than once. Your consumer therefore needs to be idempotent.
This is often the best default for microservices. For example:
OrderCreated
↓
Message broker
↓
Payment Service
↓
process(order_id)
If OrderCreated arrives twice, Payment Service should recognize that order_id has already been processed rather than charging the customer twice.
For example, Amazon SQS Standard provides at-least-once delivery and best-effort ordering, so applications using it should tolerate duplicates and reordering.
Ask where ordering is required.
You often don't need:
"Every message in the entire system must be globally ordered." Instead, you need:
"Updates for the same order must be processed in order." That distinction is extremely important for scalability.
For example:
Order 101 → Message Group A → ordered
Order 102 → Message Group B → ordered
A and B can be processed concurrently.
SQS FIFO, for example, provides ordering within a message group while allowing different groups to be processed concurrently.
This is one of the most important architectural distinctions.
Producer → Queue → Worker
You want to distribute work among consumers:
Usually, each message is handled by one worker.
→ Service A
Producer → Log → → Service B
→ Service C
Multiple independent consumers need the same events, and you care about:
That's where something like Kafka is often a better conceptual fit than a simple work queue.
A useful mental model is:
| Technology | Particularly good for |
|---|---|
| Amazon SQS | Simple managed work queues, especially on AWS |
| RabbitMQ | Flexible routing, traditional broker semantics, commands/tasks |
| Kafka | High-throughput event streaming, replay, multiple consumers |
| NATS / JetStream | Lightweight, fast messaging and cloud-native systems |
| Cloud-native queue | Teams wanting minimal infrastructure operations |
The specific product matters less than matching its semantics to your workload.
For example, SQS gives you managed queues, visibility timeouts, batching, encryption, and dead-letter queues without requiring you to operate a broker cluster yourself.
This is where many engineering teams make the wrong choice.
Ask:
Who will operate this at 3 AM? A self-managed broker can give you considerable control, but you're also responsible for things such as:
If you're on AWS and need a straightforward asynchronous work queue, for example, SQS may be preferable simply because the infrastructure burden is much lower.
This is arguably more important than raw throughput.
A good queue should give you sensible answers to:
Consumer crashes halfway through processing:
message
↓
consumer starts
↓
consumer crashes
↓
message becomes available again
↓
another consumer retries
Message repeatedly fails:
Queue
↓
retry
↓
retry
↓
retry
↓
Dead Letter Queue
Dead-letter queues are particularly useful for isolating "poison messages" without stopping the rest of the workload. SQS, for example, supports DLQs and redriving failed messages back to the source queue.
Also think about:
This is a classic microservices problem.
Suppose you do:
BEGIN TRANSACTION
INSERT order
COMMIT
publish OrderCreated
What if the database commit succeeds but publishing fails?
Now your database says:
Order 123 exists
but your event system says:
I've never heard of Order 123
A common solution is the transactional outbox pattern:
Database
┌──────────────┐
│ orders │
│ outbox │
└──────┬───────┘
│
↓
Outbox publisher
│
↓
Broker
│
↓
Consumers
This architectural issue can be more consequential than whether you choose RabbitMQ versus Kafka.
Ask how you want consumers to scale.
For a simple worker queue:
Queue
/ | \
Worker Worker Worker
Adding workers increases processing capacity.
For ordered workloads, you may instead need partitioning/grouping:
Customer A → partition 1
Customer B → partition 2
Customer C → partition 3
That lets you preserve ordering where necessary while still processing independent entities concurrently.
This is why "we need ordering" should never automatically lead to "we need one consumer."
I'd create a small requirements table before selecting anything:
| Requirement | Target |
|---|---|
| Peak throughput | 50k msg/sec |
| Message size | ≤ 100 KB |
| Delivery | At least once |
| Ordering | Per order ID |
| Retention | 7 days |
| Replay | Yes |
| Consumer model | Multiple independent consumers |
| Max processing latency | < 5 sec |
| DLQ | Required |
| Multi-region | Eventually |
| Managed service | Preferred |
Then score candidate technologies against those requirements.
This prevents the common mistake of choosing a technology because "Kafka is fast" or "RabbitMQ is popular."
I'd use something roughly like this:
Do you need durable asynchronous messaging?
│
↓
Yes → Is this primarily work distribution?
│
┌──────┴──────┐
Yes No
│ │
↓ ↓
Queue/broker Event streaming?
│ │
│ ↓
│ Need replay + multiple
│ independent consumers?
│ │
│ Yes
│ ↓
│ Kafka-like platform
│
↓
Does strict ordering matter?
│ │
No Yes
│ │
↓ ↓
Standard queue FIFO/partitioned
Then apply the managed-vs-self-hosted decision.
For a typical microservices system:
The biggest mistake is asking "Which message queue is best?" The better question is:
"What delivery, ordering, replay, scaling, and failure semantics does my architecture require—and which technology provides those semantics with the least operational complexity?" That framing tends to lead to a much better choice.
That framing tends to lead to a much better choice.
Choosing a message queue for a microservices architecture is less about picking the “best” broker and more about matching **messaging semantics to your workload**. ## 1. Start with the messaging pattern First ask what you're actually trying to accomplish:
Choosing a message queue for a microservices architecture is less about picking the “best” broker and more about matching messaging semantics to your workload.
First ask what you're actually trying to accomplish:
OrderCreated consumed by billing, analytics, notifications, and fraud detection.This distinction often narrows the candidates dramatically.
Don't start with "Kafka vs. RabbitMQ." Start with questions like:
| Requirement | Question |
|---|---|
| Delivery | Can messages be lost? |
| Duplicates | Can consumers safely receive the same message twice? |
| Ordering | Must messages be processed in order? |
| Replay | Do consumers need to reread old events? |
| Retention | How long must messages/events remain available? |
| Throughput | 100 msg/s or 1M+ msg/s? |
| Latency | Is millisecond-level latency important? |
| Fan-out | How many independent consumers need the same event? |
| Backpressure | What happens when consumers fall behind? |
| Failure handling | Do you need retries and dead-letter queues? |
A particularly important point: design for at-least-once processing unless you have a very specific reason not to. Kafka explicitly distinguishes at-most-once, at-least-once, and exactly-once semantics, and notes that end-to-end exactly-once behavior depends on how the destination system participates in the transaction.
So make your consumers idempotent. For example:
Message:
{
"eventId": "8f3...",
"orderId": "123",
"type": "OrderCreated"
}
Then have the consumer ensure that processing eventId = 8f3... twice doesn't create two orders, charge a customer twice, etc.
Best when your architecture is fundamentally event-driven and stream-oriented.
Choose it when you need:
Kafka's model is particularly attractive when an event is more like a durable fact — "Order 123 was created" — rather than simply a task saying "do this work." Kafka also provides configurable delivery semantics and durable committed logs.
Tradeoff: It introduces more operational and conceptual complexity than a simple work queue.
Best when you need a traditional message broker/work queue with sophisticated routing.
Good for:
RabbitMQ has explicit acknowledgements, publisher confirms, requeueing, and consumer prefetch controls. Those features give you considerable control over reliability and consumer backpressure.
Tradeoff: If your dominant requirement is massive durable event streaming and replay, Kafka is usually a more natural fit.
If you're already heavily invested in AWS, SQS is often the simplest answer.
Choose it when you want:
SQS Standard provides at-least-once delivery and best-effort ordering; FIFO provides ordered processing and deduplication capabilities.
Tradeoff: It's intentionally less like a general-purpose event log than Kafka.
A common mistake is saying:
"We need ordering." Instead ask:
What exactly needs to be ordered? Maybe you don't need global ordering. You only need:
Order 123:
Created → Paid → Shipped
while these can happen independently:
Order 123 ─┐
Order 456 ─┼─ process concurrently
Order 789 ─┘
Partitioning/message groups can give you ordering per entity without sacrificing all your parallelism. SQS FIFO, for example, supports ordered message groups, while Kafka commonly uses partitions for this purpose.
Global ordering is usually expensive and often unnecessary.
Ask what happens when:
For example, RabbitMQ's manual acknowledgements allow unacknowledged messages to be requeued when a consumer connection fails, which means consumers need to tolerate redelivery. Prefetch can also limit the number of outstanding messages and prevent consumers from being overwhelmed.
These behaviors are often more important than raw benchmark throughput.
Ask:
A theoretically superior technology can be the wrong choice if nobody on the team knows how to operate it.
The queue isn't going to solve distributed-system problems by itself.
I'd expect a production microservice system to have things like:
Producer
│
▼
Message broker
│
├── Consumer A
├── Consumer B
└── Consumer C
│
▼
Database
along with:
For example, SQS explicitly supports dead-letter queues, while RabbitMQ provides acknowledgement/requeue mechanisms for failed consumption.
I'd use something roughly like this:
Need messaging?
│
▼
Is it primarily an
event stream?
/ \
Yes No
│ │
▼ ▼
Kafka Simple work queue?
/ \
Yes No
│ │
▼ ▼
Managed cloud? Complex routing/
/ \ AMQP semantics?
Yes No │
│ │ ▼
SQS RabbitMQ RabbitMQ
With an important exception: if you're already deeply invested in AWS and simply need asynchronous work between services, SQS is often the lowest-operational-cost choice.
The most important design decision isn't the broker, though. It's defining delivery, ordering, retry, idempotency, and failure semantics first. Once those are explicit, the technology choice becomes much easier.
Need messaging?
│
▼
Is it primarily an
event stream?
/ \
Yes No
│ │
▼ ▼
Kafka Simple work queue?
/ \
Yes No
│ │
▼ ▼
Managed cloud? Complex routing/
/ \ AMQP semantics?
Yes No │
│ │ ▼
SQS RabbitMQ RabbitMQ
With an important exception: if you're already deeply invested in AWS and simply need asynchronous work between services, SQS is often the lowest-operational-cost choice.
The most important design decision isn't the broker, though. It's defining delivery, ordering, retry, idempotency, and failure semantics first. Once those are explicit, the technology choice becomes much easier.
Choosing a message queue or event broker for a microservices architecture is a foundational decision that impacts system scalability, reliability, and operational complexity. To make the right choice, evaluate your architectural needs across several key dimensions. - **Delivery Semantics and Guarantees** : Determine…
Choosing a message queue or event broker for a microservices architecture is a foundational decision that impacts system scalability, reliability, and operational complexity. To make the right choice, evaluate your architectural needs across several key dimensions.
To help narrow down the best fit, tell me: