Message Queue vs PubSub
TL;DR
| Message Queue | PubSub | |
|---|---|---|
| Consumers | one and only one consumer | allows multiple consumers |
| Message Deletion | after ONE consumer ack consumption | after ALL consumers ack consumption |
| Message Process Order | may be out of order if multiple consumers | messages are received in order by each consumer |
Message Queue
A single queue, events may be distributed to multiple consumers.
- Each message for a given topic or channel is delivered to and processed by exactly one consumer. (e.g. every paycheck is issued once and only once)
- Supports high rates of consumption by adding multiple consumers for each topic, but only one consumer will receive each message on the topic.
- The message will be deleted once a consumer has acknowledged consumption of the message.
- In the case of network or consumer failures, the message queue will try resending an affected message at a later time (not necessarily to the same consumer) and as a result, that message may be processed out of order.
PubSub
One topic may have mutilple consumers (subscribers). One queue per each consumer (subscriber).
- decoupling publishers and subscribers:
- Publishers need not target their messages to specific subscribers nor even know how many subscribers there will be.
- Publishers and subscribers need not even be running at the same time
- Publishers and subscribers can be implemented in different languages / frameworks.
- message persistence: messages are kept in permanent storage until they have been acknowledged by all interested subscribers. Persistence allows client applications to be resilient in the face of intermittent application, network, and machine failures.
How to choose
- Use message queues if a consumer application instance goes down then another consumer will be able to handle the message instead.
- Use pubsub, if a subscriber is down then once it has recovered the messages it has missed will be available for consumption in its subscribing queue.
Options
Message Queues:
- ActiveMQ
- RabbitMQ
- ZeroMQ
Distributed PubSub:
- Kafka
Cloud:
- Amazon Kinesis
- Azure Web PubSub
- Google Cloud Pub/Sub
Recommended ReadingSponsored
Versus
32-bit vs 64-bit
AES vs RSA
Agent vs Agentless
Annotations vs Decorators
Terraform vs Ansible
BASH vs ZSH
BigQuery vs Bigtable
Block Storage vs File Storage vs Object Storage
Canvas vs SVG
cgroupfs vs systemd
Constructor vs Init() vs Factory
Container Image vs Helm Chart vs OCI Bundle
Containers vs Virtual Machines (VMs)
C vs C++
Java vs C++
Rust vs C++
crictl vs ctr
Dagger vs Guice
DMA vs RDMA
DOM vs Virtual DOM vs Shadow DOM
DQL vs DDL vs DCL vs DML
eBPF vs Sidecar
Flux vs Redux
Full Disk Encryption vs Partition Encryption
Gatekeeper vs OPA
Google vs Open Source
Why MCP uses JSON-RPC 2.0 instead of grpc
gRPC vs OpenAPI
gtag.js vs Google Tag Manager (GTM)
Versus
Kotlin vs Java
Jetty vs Netty
.js vs .jsx vs .ts vs .tsx
Kata Containers vs KubeVirt
Linux Namespace vs Kubernetes Namespace
Linux vs BSD
LLVM vs JVM
Data Mining vs Machine Learning vs Artificial Intelligence vs Data Science
Managed Kubernetes vs Self-managed Kubernetes
Management Plane vs Control Plane vs Data Plane
Microcontroller vs Microprocessor vs Computer
MMU vs IOMMU
Single-tenant vs Multi-tenant vs Multi-single-tenant
Multithreading vs Multiprocessing vs Distributed Systems
Node.js vs Erlang
OCI Image vs Docker Image
OCI vs CRI
OpenSSH vs OpenSSL
Pass-by-value vs Pass-by-reference
Podman vs nerdctl
POSIX vs SUS vs LSB
Private Key vs Public Key vs Certificate
Proto Edition 2024 vs Proto Edition 2023
Proto2 vs Proto3 vs Proto Editions
Message Queue vs PubSub
React vs Flutter vs Angular
REST vs SOAP
RSA vs ECDSA
select vs. poll vs. epoll
SLI vs SLO vs SLA
Spanner vs Bigtable
Static Site Generation vs Server-side Rendering vs Client-side Rendering
Stack based VM vs Register based VM
Stateless vs Stateful
Strong Consistency vs Eventual Consistency
stubs vs mocks vs fakes
Subroutines vs Coroutines vs Generators
Software Engineer vs Site Reliability Engineer
Symlinks vs Hard Links
JAX vs Tensorflow
Tensorflow vs PyTorch
Terminal vs Shell
Throttling vs Load Shedding
Unix Domain Sockets vs Network Sockets
Unix Domain Sockets vs Shared Memory
URI vs URN vs URL vs URC
Valkey vs Redis vs Memcached
Vi vs Vim vs gVim vs Neovim
WAL vs rollback journal

