В чем разница между Apache Kafka и RabbitMQ?

Ответ

Kafka и RabbitMQ — это два популярных, но архитектурно разных брокера сообщений, предназначенных для разных сценариев.

Apache Kafka — это распределенный, отказоустойчивый журнал событий (log), оптимизированный для обработки потоков данных с высокой пропускной способностью.

  • Модель доставки: Публикация-подписка на основе партиционированного журнала. Сообщения сохраняются на диске с настраиваемой политикой хранения (дни, недели).
  • Гарантии: Гарантированный порядок сообщений в пределах партиции. Сообщения не удаляются после чтения потребителем.
  • Использование: Стриминг данных, Event Sourcing, сбор логов, метрик, построение пайплайнов реального времени.
  • Масштабирование: Горизонтальное за счет увеличения числа партиций в топике.

RabbitMQ — это классический брокер сообщений, реализующий протокол AMQP, ориентированный на гибкую маршрутизацию и гарантированную доставку.

  • Модель доставки: Гибкая маршрутизация через exchanges (direct, topic, fanout, headers). Очереди создаются потребителями. Сообщения удаляются после подтверждения доставки (ACK).
  • Гарантии: Поддержка транзакций, подтверждений (ACK/NACK), Dead Letter Exchanges для надежности.
  • Использование: Фоновая обработка задач (Task Queues), RPC, сложная маршрутизация сообщений между микросервисами.
  • Масштабирование: Вертикальное или через кластеризацию (очереди привязаны к узлам).
Сравнение в таблице: Критерий Apache Kafka RabbitMQ
Основная абстракция Упорядоченный журнал (лог) с партициями Очередь сообщений с гибкой маршрутизацией
Хранение сообщений Долгосрочное (на диске, по retention policy) Краткосрочное (до подтверждения потребления, может сбрасываться на диск)
Пропускная способность Очень высокая (миллионы сообщений/сек) Высокая (десятки тысяч сообщений/сек)
Латентность Низкая (миллисекунды) Очень низкая (микросекунды)
Протокол Собственный (бинарный TCP), есть HTTP API В первую очередь AMQP 0.9.1, также STOMP, MQTT.

Пример сценариев:

  • Выбрать Kafka: Нужно обрабатывать поток кликов с сайта, строя в реальном времени дашборд. Сообщения ценны как исторические данные.
  • Выбрать RabbitMQ: Нужно распределить задачи по генерации PDF-отчетов между несколькими воркерами. Каждая задача должна быть выполнена ровно один раз.

В современных системах их могут использовать вместе: RabbitMQ — для межсервисного взаимодействия (команды), Kafka — для централизованного сбора и распространения событий (events).

Ответ 18+ 🔞

Слушай, история про Кафку и Рэббита — это как сравнивать грузовик с пикапом. Оба перевозят, но задачи у них, блядь, с разных планет. Сейчас разжуёшь.

Apache Kafka — это, ёпта, не просто брокер, а бесконечная лента событий, железобетонный журнал. Представь себе здоровенный конвейер, куда всё сыпется: клики, логги, транзакции. Всё пишется на диск и лежит там овердохуища времени — дни, недели, пока место есть. Главная фишка — порядок в рамках одной «дорожки» (партиции) гарантирован, и сообщения не исчезают после чтения. Хочешь — прочитал, отъехал, через месяц вернулся и перечитал заново. Масштабируется это дело просто — накинул партиций, и поехали дальше. Идеально для стриминга, когда данные льются рекой и их надо и обрабатывать сейчас, и хранить про запас.

RabbitMQ — это классический почтальон-перфекционист. Тут не просто лента, а целая система сортировки с умными правилами (exchanges). Сообщение пришло — его маршрутизировали по ключу, заголовку или просто разослали всем (fanout). Задача — не столько хранить, сколько гарантированно доставить и ровно один раз обработать. Как только потребитель сказал «ок, принял» (ACK), сообщение обычно удаляется. Тут есть и мёртвые письма (Dead Letter), и подтверждения. Это инструмент для чёткой работы: отправил задачу на генерацию отчёта — она должна уйти свободному воркеру и быть выполнена. Никаких «ой, прочитал, но не обработал, а оно уже пропало».

Короче, таблица, чтобы совсем не охуеть от информации:

Критерий Apache Kafka RabbitMQ
Что это по сути Бесконечный журнал-лента (log) Умный маршрутизатор сообщений
Что делаем с данными Пишем всё подряд, храним долго Доставляем адресату, потом обычно удаляем
Скорость потока Охуенная, миллионы в сек Высокая, десятки тысяч в сек
Задержка Низкая (мс) Очень низкая (мкс)
Язык общения Свой протокол (бинарный) В основном AMQP (как открытый стандарт)

Когда что брать, чтобы не облажаться:

  • Тащишь Кафку, когда: Тебе нужно всё логировать. Поток событий с сайта, телеметрия с датчиков, финансовая история. Данные — это ценность, и их поток не должен прерываться. «Включил и забыл», а данные пусть текут.
  • Хватаешь Рэббита, когда: Нужна точечная работа. Фоновая отправка писем, обработка заказов, балансировка задач между воркерами. Здесь важна не история, а факт: каждая задача должна быть взята в работу и чётко выполнена.

А в серьёзных системах их, бывает, используют вместе, и это не мудя какая-то. RabbitMQ — для точных команд между сервисами («создай пользователя»), а Kafka — как центральная нервная система, куда стекаются все события (пользователь создан, залогинился, купил), чтобы кто угодно мог их подцепить и сделать свои дела.