В чем разница между Kafka и RabbitMQ и какие кейсы их использования?
Что проверяют
Понимаете ли вы разницу моделей: журнал против очереди. Из неё следует всё остальное.
Как отвечать
RabbitMQ это брокер очередей. Отправитель кладёт сообщение в обменник, тот по правилам маршрутизации раскладывает его по очередям, потребитель читает и подтверждает, после чего сообщение исчезает. Умная маршрутизация, приоритеты, отложенная доставка, очередь недоставленных сообщений. Модель «задача для одного исполнителя».
Kafka это распределённый журнал. Сообщения пишутся в тему, разбитую на партиции, и лежат заданное время независимо от того, прочитал их кто-то или нет. Потребители объединены в группы и сами двигают свой сдвиг, поэтому одну тему могут независимо читать несколько разных систем, а при необходимости перечитать всё с начала. Модель «поток событий для многих читателей».
Практические следствия:
- порядок: у Kafka гарантирован внутри партиции, ключ определяет партицию. У RabbitMQ порядок в пределах очереди, но при нескольких потребителях легко теряется;
- пропускная способность: Kafka заметно выше за счёт последовательной записи и пакетов;
- повтор: у Kafka встроен, достаточно сдвинуть смещение. У RabbitMQ прочитанное сообщение уже удалено;
- сложность: RabbitMQ проще поднять и обслуживать.
Как выбирать: команды и задачи с гибкой маршрутизацией это RabbitMQ, поток событий, аналитика и несколько независимых потребителей это Kafka.
Где спотыкаются
Называют Kafka очередью и не могут объяснить, куда девается сообщение после чтения.
Считают, что Kafka гарантирует глобальный порядок.
Не знают, что доставка обычно «хотя бы один раз», и не делают обработчик идемпотентным.
Увеличивают число потребителей в группе сверх числа партиций и удивляются, что лишние простаивают.