Your Kafka consumers process 50,000 events per second until one pod restarts and the entire group freezes for 45 seconds. Consumer group rebalancing is the silent killer of event-driven throughput. Here is how the protocol actually works, the configs that stop the stalls, and the Node.js consumer setup that survives rolling deployments.
Kafka and RabbitMQ both move messages and are not interchangeable. One is a distributed log, the other is a message router. Picking the wrong one means a year of fighting the abstractions. Here is the workload-based decision tree, the operational realities of each, and the rare case where you need both.
Whenever your code does “write to the database, then publish to Kafka,” there is a window where one succeeds and the other does not. The outbox pattern closes that window with a single extra table and 60 lines of dispatcher code. Here is how it works and why every alternative ends up reinventing it.