Kafka vs RabbitMQ: сравнение по пунктам
В предыдущих постах мы рассмотрели основы по RabbitMQ и Kafka и собрали полезные материалы для изучения. Перейдём к сравнению, что лучше?
Подход к обмену сообщениями
- В RabbitMQ используется подход push, когда брокер сам активно отправляет сообщения консьюмерам, которые подписаны на очереди. Плюсы: меньше задержка и равномернее нагрузка. Минусы: меньшая гибкость для потребителя и невозможность потребления сообщений пакетами.
- В Kafka используется подход pull, когда консьюмеры сами отправляют запросы в брокер раз в n миллисекунд для получения новой порции сообщений. Такой подход позволяет группировать сообщения в пакеты, достигая лучшей пропускной способности. К минусам модели можно отнести потенциальную разбалансированность нагрузки между разными консьюмерами и более высокую задержку обработки данных.
Удаление сообщений из очереди
- В RabbitMQ после получения консьюмерами сообщение удаляется из очереди. Благодаря этому одно и то же сообщение может быть обработано только одним консьюмером и не хранится дольше необходимого.
- В Kafka сообщения после прочтения консьюмерами не удаляются и могут храниться неограниченное время. Благодаря этому одно и то же сообщение может быть обработано сколько угодно раз разными консьюмерами и в разных контекстах.
Скорость доставки сообщений
- Очереди RabbitMQ работают быстрее всего на относительно небольших объёмах.
- Kafka хранит большие объемы данных с минимальными издержками, поэтому подходит для передачи большого количества сообщений, + поддерживает пакетное потребление сообщений.
Масштабируемость
- RabbitMQ может масштабироваться горизонтально, но это требует большего количества настроек и управления.
- Kafka легко масштабируется горизонтально, что позволяет добавлять новые брокеры для обработки большего объема данных.
Маршрутизация сообщений
- В RabbitMQ все сообщения маршрутизируются через обменник (exchange) перед попаданием в очереди. RabbitMQ предлагает несколько видов маршрутизации с помощью ключей по протоколу AMQP.
- У Kafka упрощённый подход к маршрутизации.
Протокол
- RabbitMQ поддерживает несколько стандартизированных протоколов: AMQP, MQTT, STOMP и др. Это позволяет заменить его на любой брокер на основе AMQP.
- Kafka использует собственный двоичный протокол поверх TCP. Вы не сможете так просто удалить или заменить эту платформу, потому что она единственная реализует данный протокол.
Приоритезация сообщений
- RabbitMQ позволяет назначать приоритет сообщениям.
- В Kafka приоритет для всех сообщений одинаков и его нельзя изменить. Обходной путь: создать нескольких топиков под сообщения с разным приоритетом, например, events_low, events_medium, events_high, а затем реализовать логику приоритетного чтения на стороне консьюмера.
Выводы
Kafka – это про большие данные и потоковую обработку:
- когда в реальном времени требуется обрабатывать огромные куски данных с частотой от тысяч до миллионов сообщений в секунду.
- когда нужно собирать кучу данных с большого числа источников (например, системы логирования и мониторинга).
- когда несколько потребителей должны получить все сообщения (например, в системах подписок).
RabbitMQ подходит для более стандартной очереди или брокера сообщений:
- когда нужна сложная маршрутизация сообщений (например, выборочная подписка или публикация).
- когда нужно просто передавать краткосрочные сообщения от одного микросервиса к другому.
- когда нужна поддержка разных протоколов обмена и более зрелый подход к стандартной очереди задач.
Сравнительная таблица RabbitMQ и Kafka
| Критерий | RabbitMQ | Kafka |
|---|---|---|
| Протокол | AMQP, MQTT, STOMP | Собственный двоичный протокол поверх TCP |
| Модель обмена сообщениями | Push, брокер оповещает тех потребителей, которые подписались на очередь | Pull, потребители сами периодически читают сообщения из очереди |
| Задержка обработки да нных | Минимальная за счёт активной отправки сообщений брокером | Выше за счёт интерактивного опроса брокера консюмерами |
| Гарантия доставки сообщений | - At most once - At least once | - At most once - At least once - Exactly once |
| Удаление сообщений из очереди | Удаляются сразу после обработки потребителями | Сообщения не удаляются сразу, а очищаются через конфигурацию хранения |
| Приоритизация сообщений | Поддерживается. Сообщениям можно назначать разные приоритеты, и брокер будет отправлять их потребителям в соответствии с этим | Нет, но можно несколько топиков создать с разным приоритетом |
| Порядок доставки сообщений | Гарантируется в рамках одной очереди, но не гарантируется между разными очередями | Гарантируется в рамках одной партии, но не гарантируется между разными партиями |
| Маршрутизация | "Умная": все сообщения маршрутизируются через обменники (exchange) перед подачей в очереди | "Тупая": сообщения просто кладутся туда, куда были посланы продьюсером |
| Возможность перечитать уже обработанное сообщение заново | Нет, так как оно уже удалено после обработки потребителями | Можно перечитывать любые сообщения |
| Пакетная обработка сообщений | Нет | Поддерживается благодаря модели pull, потребитель может считывать сколько угодно сообщений за раз |
| Поддержка транзакций | Ограниченно поддерживается. RabbitMQ поддерживает транзакции на уровне сообщений, но не на уровне очередей или обменников | Полностью поддерживается. Kafka может выполнять транзакции на уровне топиков, обеспечивая доставку сообщений "всё или ничего" (exactly-once) при потоковой обработке |
| Производительность | До 10 тыс. сообщений в секунду | До 1 млн сообщений в секунду |
| Масштабируемость | Может масштабироваться горизонтально, но это требует большей сложности в настройке и управлении | Kafka легко масштабируется горизонтально, добавление новых брокеров упрощает процесс |
| Порог вхождения | Легкая настройка и администрирование. Есть пользовательский веб-интерфейс для админа, где можно видеть активные очереди, потребителей и сообщений в реальном времени | Высокий порог вхождения из-за необходимости мониторинга кластера, а также специфического протокола Kafka |
| Отказоустойчивость | Высокая за счёт репликации очередей и встроенных фейловеров | Высокая за счёт репликации партий и сохранности оффсетов консумеров |
| Скорость доставки сообщений | Срабатывает быстрее на относительно небольших объёмах | Лучше подходит для передачи большого количества сообщений |
Подборка материалов
- Сравнительный анализ Apache Kafka и RabbitMQ — Хабр, БФТ-Холдинг
- Чем различаются Kafka и RabbitMQ: простыми словами — Хабр, Иннотех
- RabbitMQ против Kafka: два разных подхода — Хабр, ITSumma
- RabbitMQ и Apache Kafka: что выбрать — Слёрм
- В чем разница между Kafka и RabbitMQ? — AWS