Перейти к основному содержимому

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

КритерийRabbitMQKafka
Протокол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
ОтказоустойчивостьВысокая за счёт репликации очередей и встроенных фейловеровВысокая за счёт репликации партий и сохранности оффсетов консумеров
Скорость доставки сообщенийСрабатывает быстрее на относительно небольших объёмахЛучше подходит для передачи большого количества сообщений

Подборка материалов

  1. Сравнительный анализ Apache Kafka и RabbitMQ — Хабр, БФТ-Холдинг
  2. Чем различаются Kafka и RabbitMQ: простыми словами — Хабр, Иннотех
  3. RabbitMQ против Kafka: два разных подхода — Хабр, ITSumma
  4. RabbitMQ и Apache Kafka: что выбрать — Слёрм
  5. В чем разница между Kafka и RabbitMQ? — AWS

Видео

  1. RabbitMQ и чем он отличается от Apache Kafka за 10 минут