4 мин

Брокеры сообщений — нюансы

Разбираемся, что такое брокер сообщений и чем отличаются три классических решения — RabbitMQ, ActiveMQ и Kafka: протоколы, модели сообщений, гарантии доставки и партиции.

Брокеры сообщений — нюансы

Пролог

Эту статью пишу вслед за своей лекцией про типы интеграций и брокеры сообщений.

Брокер?

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

Что умеет брокер сообщений:

  1. Очередь сообщений. Отправители кладут сообщения в очередь, получатели забирают их оттуда. Так компоненты общаются асинхронно — никто никого не ждёт.
  2. Темы и подписки. Часть брокеров умеет в темы (topics). Тема — это категория: отправитель публикует в неё сообщения, а все подписчики темы их получают.
  3. Маршрутизация. Брокер направляет сообщение нужному получателю — по фильтрам, по правилам или другим механизмам.
  4. Гарантии доставки. В зависимости от требований брокер даёт разный уровень гарантий: «at-least-once», «at-most-once» или «exactly-once». Разберём их ниже.
  5. Отказоустойчивость. Часть брокеров реплицирует данные и сама переизбирает лидера — система продолжает работать, даже когда узел падает.

Чем отличаются друг от друга 3 классических брокера?

RabbitMQ

  1. Протокол: AMQP (Advanced Message Queuing Protocol).
  2. Модель сообщений: очереди — сообщение уходит в очередь, его забирает один из потребителей, и прочитанное сообщение сгорает!
  3. Гарантии доставки: поддерживает разные уровни — «at-most-once», «at-least-once» и «exactly-once».

Apache ActiveMQ

  1. Протокол: несколько протоколов на выбор — OpenWire, AMQP, MQTT и другие.
  2. Модель сообщений: и очереди, и темы (pub/sub) — сообщение публикуется в тему и расходится по всем подписчикам.
  3. Гарантии доставки: обеспечивает «at-least-once».

Apache Kafka

  1. Протокол: собственный протокол Kafka.
  2. Модель сообщений: построена вокруг лога — сообщения хранятся как журнал записей. Это стриминговая платформа: и потоковая обработка, и хранение данных.
  3. Гарантии доставки: строгий порядок сообщений и «exactly-once». Плюс масштабируемость и устойчивость к отказам.

Гарантии доставки сообщений

  1. At-Most-Once (не более одного раза). Сообщение либо дойдёт, либо потеряется. Дублей не будет, но и доставку никто не обещает.
  2. At-Least-Once (не менее одного раза). Сообщение точно дойдёт хотя бы раз — но может прийти и дважды. Потерь нет, зато возможны дубли.
  3. Exactly-Once (ровно один раз). Сообщение придёт один раз — без потерь и без дублей. Самый строгий уровень гарантий.

Теперь посмотрим, как каждый брокер реализует эти гарантии:

RabbitMQ

  • Гибко настраивает гарантии через подтверждения (acknowledgements, сокращённо ack);
  • В очередях можно требовать подтверждение только после успешной доставки — это и есть at-least-once.

Apache ActiveMQ

  • Тоже гибко настраивает гарантии разными конфигурациями подтверждений;
  • Под задачу выбираешь уровень — «at-least-once» или «exactly-once».

Apache Kafka

  • Держит высокие гарантии за счёт модели лога;
  • Строгий порядок сообщений плюс «at-least-once» и «exactly-once»;
  • Подходит там, где нужна точная и надёжная доставка.

Немного подробнее о Kafka и партициях

В Kafka данные лежат в темах (topics), а каждая тема делится на партиции (partitions). Партиции — это то, за счёт чего Kafka масштабируется горизонтально и раскидывает нагрузку между брокерами.

Как работают партиции

  1. Распределение данных. Тема дробится на несколько партиций, и каждая хранит свою упорядоченную последовательность сообщений.
  2. Горизонтальная масштабируемость. Партиции раскидываются по разным брокерам; каждый брокер отвечает за одну или несколько.
  3. Параллельная обработка. Разные партиции обрабатываются независимо друг от друга — отсюда и рост производительности.
  4. Распределение нагрузки. Каждый брокер держит только часть данных, поэтому нагрузка ложится равномерно.

Лидер партиции

  • В каждой партиции один брокер — лидер (leader), остальные — реплики (replicas).
  • Лидер обслуживает чтение и запись, реплики держат копию ради отказоустойчивости и доступности.
  • Новое сообщение сначала пишется в лидера, а затем реплицируется на остальные брокеры.
  • Если лидер падает, одна из реплик автоматически становится новым лидером — Kafka продолжает работать без ручного вмешательства.

Подробнее про партиции и устройство Kafka — в этой статье: там же разобрана логика сегментов и лидеров партиций.

Что ещё почитать

  1. Apache Kafka: основы технологии
  2. Comparing Apache Kafka, ActiveMQ, and RabbitMQ

Из моего Telegram-канала @it_underside.

Ваш ДПУПП

Похожие статьи

Форматы обмена данными: от JSON до protobuf

#данные #архитектура

Большой разбор форматов обмена данными: где живёт JSON, зачем нужен XML, чем хорош YAML и когда пора переходить на бинарные Protobuf, Avro и MessagePack — с привязкой к API и брокерам сообщений.

Копировать — дёшево. Эксплуатировать — дорого

#импортозамещение #архитектура

Почему «сделали аналог» и «локализовали» — это не инновация, а отложенный счёт. Разбор того, во что обходится жизнь на чужих архитектурах и почему суверенитет нельзя купить на Marketplace.

FAANG по-русски: культ канонов и антипаттерны, рождающиеся из лучших намерений

#архитектура #управление

Почему «хотим архитектуру как в FAANG» так часто оказывается началом конца. Про культ канонов, антипаттерны из лучших намерений и одно короткое слово, которое спасает проекты чаще любых паттернов.