Add the broker-comparison module
Kafka, RabbitMQ and Pulsar measured side by side on ordering, replay and consumer scaling by driving the three client libraries directly, plus an operational-footprint measurement of each broker's own distribution. Nine tests, three brokers started without Docker, and every number in the documentation regenerated by scripts/run-all.sh.
This commit is contained in:
17
README.md
17
README.md
@@ -11,11 +11,14 @@ module's `scripts/run-all.sh`, never typed by hand.
|
||||
| [`kafka-error-handling/`](kafka-error-handling/README.md) | [Kafka Error Handling with Spring Kafka 4.1: DLT, Retry Topics and Poison Pills](https://ankurm.com/spring-kafka-4-1-error-handling-dlt-retry-topics/) | What the default error handler really does, why a poison pill stops a partition, and what blocking retries cost that retry topics do not |
|
||||
| [`rabbitmq/`](rabbitmq/README.md) | [Spring Boot and RabbitMQ: Exchanges, Queues, Bindings and a Working Dead-Letter Queue](https://ankurm.com/spring-boot-rabbitmq-exchanges-dead-letter-queue/) | All four exchange types against a real broker, manual acknowledgement, and a dead-letter path exercised through both rejection and TTL expiry |
|
||||
|
||||
The two brokers make an instructive pair. Kafka's consumer holds an offset and the broker
|
||||
remembers nothing about individual records; RabbitMQ's broker owns the message until it is
|
||||
acknowledged and can route, expire and dead-letter it on its own. Almost every difference in how
|
||||
you handle failure follows from that one sentence — which is why Kafka needs a retry topic
|
||||
to do what RabbitMQ does with a queue argument.
|
||||
| [`broker-comparison/`](broker-comparison/README.md) | [Kafka vs RabbitMQ vs Pulsar for Java Teams: A Decision Framework with Benchmarks](https://ankurm.com/kafka-vs-rabbitmq-vs-pulsar-java-decision-framework/) | The three brokers measured side by side on ordering, replay, consumer scaling and operational footprint, ending in a decision table where every row has a transcript behind it |
|
||||
|
||||
The brokers make an instructive set. Kafka's consumer holds an offset and the broker remembers
|
||||
nothing about individual records; RabbitMQ's broker owns the message until it is acknowledged and
|
||||
can route, expire and dead-letter it on its own; Pulsar keeps the log but lets each subscriber
|
||||
choose how it is read. Almost every difference in how you handle failure follows from those three
|
||||
sentences — which is why Kafka needs a retry topic to do what RabbitMQ does with a queue
|
||||
argument, and why `broker-comparison` is mostly an argument about where a message lives.
|
||||
|
||||
They are meant to be read in order. `kafka-basics` establishes that the default acknowledgement
|
||||
mode is `BATCH` and therefore that delivery is at-least-once; everything the error-handling
|
||||
@@ -29,8 +32,8 @@ Central and from Boot's own `spring-boot-dependencies` POM, rather than from rel
|
||||
announcements.
|
||||
|
||||
Every module runs its broker without Docker, so the transcripts can be regenerated on any
|
||||
machine with a JDK: Kafka via the in-process KRaft broker in `spring-kafka-test`, RabbitMQ via a
|
||||
real broker started by the module's own scripts. Each module also ships a Testcontainers
|
||||
machine with a JDK: Kafka via the in-process KRaft broker in `spring-kafka-test`, RabbitMQ and
|
||||
Pulsar via real brokers started by the modules' own scripts. Each module also ships a Testcontainers
|
||||
configuration for the cases where the deployed image is what you need to test against.
|
||||
|
||||
## Licence
|
||||
|
||||
Reference in New Issue
Block a user