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

8.05. Брокеры сообщений

Разработчику Архитектору Инженеру

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

Что такое брокер сообщений?

Брокер сообщений — это программное обеспечение или система, которая управляет обменом данными между приложениями, сервисами или системами.

Брокер выступает в роли посредника, который принимает сообщения от «производителей» (producers) и передаёт их «потребителям» (consumers). Это позволяет организовать асинхронную связь между компонентами системы.

Производитель отправляет сообщение в брокер и продолжает свою работу, не дожидаясь ответа от потребителя, а брокер гарантирует доставку сообщений даже в случае сбоев (например, через очереди и подтверждения) и позволяет распределять нагрузку между несколькими потребителями, что упрощает масштабирование.

Среди брокеров различают:

  • RabbitMQ (модель очередей),
  • Apache Kafka (модель топиков),
  • ActiveMQ (классический брокер сообщений с поддержкой JMS),
  • IBM MQ,
  • Redis (который также используется для кэширования).

Функциональное назначение

Декуплинг компонентов

  • Производитель и потребитель не зависят друг от друга во времени, пространстве и скорости обработки.
  • Изменение одного компонента не требует модификации других при соблюдении контракта сообщения.

Буферизация нагрузки

  • Поглощение пиковых нагрузок за счёт временного хранения сообщений.
  • Предотвращение перегрузки потребителей при всплесках активности производителей.

Маршрутизация и фильтрация

  • Направление сообщений по правилам: по ключу, содержимому, заголовкам.
  • Трансформация формата сообщений между системами с разными требованиями.

Гарантии доставки

  • Обеспечение надёжной передачи при сетевых сбоях и перезапусках компонентов.
  • Управление семантикой доставки в зависимости от требований бизнес-логики.

Архитектурные модели

Точечная очередь (Point-to-Point)

Производитель → [Очередь] → Потребитель
  • Каждое сообщение доставляется ровно одному потребителю.
  • Потребители конкурируют за сообщения в рамках группы.
  • Применение: фоновые задачи, обработка заказов, импорт данных.

Публикация-подписка (Publish-Subscribe)

Производитель → [Топик] → Подписчик 1
→ Подписчик 2
→ Подписчик 3
  • Каждое сообщение доставляется всем активным подписчикам.
  • Подписчики независимы: обработка одним не влияет на других.
  • Применение: рассылка уведомлений, события домена, кэш-инвалидация.

Гибридные модели

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

Ключевые концепции

Сообщение (Message)

  • Единица передаваемых данных с метаданными.
  • Структура: идентификатор, заголовки (метаданные), тело (полезная нагрузка), временная метка.
  • Идемпотентность: сообщения должны допускать повторную обработку без побочных эффектов.

Очередь (Queue)

  • Буфер хранения сообщений с семантикой FIFO (first-in-first-out).
  • Гарантия упорядоченности в пределах одной очереди.
  • Блокировка сообщения во время обработки для предотвращения параллельной обработки.

Топик (Topic)

  • Логический канал публикации событий.
  • Не хранит состояние потребителей — каждый подписчик отслеживает свою позицию.
  • Поддержка иерархии (например, orders.us.east с возможностью подписки на orders.*).

Производитель (Producer)

  • Компонент, отправляющий сообщения в брокер.
  • Не зависит от доступности или количества потребителей.
  • Может указывать ключ маршрутизации для определения партиции или очереди назначения.

Потребитель (Consumer)

  • Компонент, извлекающий сообщения из брокера.
  • Подтверждает обработку (acknowledgement) для удаления сообщения из очереди.
  • Может принадлежать к группе потребителей для распределения нагрузки.

Механизмы надёжности

Подтверждение доставки (Acknowledgement)

  • Автоматическое: брокер считает сообщение обработанным после передачи потребителю.
  • Ручное: потребитель явно подтверждает успешную обработку после завершения бизнес-логики.
  • Повторная доставка: сообщения без подтверждения возвращаются в очередь после таймаута или при отказе потребителя.

Персистентность

  • Запись сообщений на диск до подтверждения производителю.
  • Защита от потери данных при перезапуске брокера.
  • Торговля между производительностью (память) и надёжностью (диск).

Дедупликация

  • Фильтрация дубликатов на основе идентификатора сообщения.
  • Требует хранения истории обработанных идентификаторов в течение заданного окна.
  • Критична для сценариев с семантикой «ровно один раз».

Семантика доставки

СемантикаГарантииТребованияПрименение
At-most-onceСообщение может быть потеряно, но не будет обработано дваждыМинимальные накладные расходыНекритичные данные: телеметрия, логи
At-least-onceСообщение гарантированно доставлено, но возможна дубликацияПодтверждение после обработкиФинансовые операции, заказы
Exactly-onceСообщение обработано ровно один разТранзакционность + дедупликацияПлатежи, бухгалтерия

Типы архитектур брокеров

ТипХарактеристикиСценарии
Очереди с удалениемСообщение удаляется после подтверждения; краткосрочное хранениеОбработка задач, фоновые джобы
Журналы (logs)Неизменяемая последовательность; длительное хранение; повторное чтениеАудит, событийное хранение, потоковая аналитика
ГибридныеКомбинация очередей и журналов; гибкая политика храненияМикросервисы с разными требованиями к данным

Сравнение с альтернативными подходами

ПодходДекуплингНадёжностьСложностьЗадержка
Прямые вызовы (HTTP/RPC)НетНизкая (зависит от сети)НизкаяНизкая
Очереди сообщенийВысокийВысокаяСредняяУмеренная
Журналы событийМаксимальныйОчень высокаяВысокаяНизкая (потоковая)
База данных как очередьСреднийСредняяНизкаяВысокая

Мы рассмотрим RabbitMQ и Kafka по отдельности. Для начала давайте разграничим

КритерийRabbitMQKafka
АрхитектураОснована на очередях (queues)Основана на топиках (topics) с партициями (partitions)
Модель работыПроизводитель → Обменник (Exchange) → Очередь → ПотребительПроизводитель → Топик → Партиция → Потребитель
УпорядоченностьГарантируется порядок в пределах одной очередиГарантируется порядок только внутри одной партиции
Состояние данныхСообщения хранятся до доставки или истечения времени храненияСообщения хранятся на диске в течение заданного времени (например, 7 дней)
ПроизводительностьДо десятков тысяч сообщений в секундуДо миллионов сообщений в секунду
ЗадержкиНизкие задержки благодаря прямой передаче через очередиЗадержки выше из-за партиционирования и логической структуры
РесурсыТребует меньше ресурсов для небольших нагрузокТребует больше памяти и дискового пространства
МасштабируемостьМасштабируется за счёт добавления брокеров, но кластеризация сложнее в настройкеЛегко масштабируется за счёт добавления брокеров и партиций
Гарантия доставкиГарантированная доставка каждого сообщенияДоставка "хотя бы один раз" (at-least-once delivery)
МаршрутизацияПоддерживает сложные правила маршрутизации через обменники (exchanges)Маршрутизация ограничена топиками и партициями
Веб-интерфейсВстроенный веб-интерфейс (RabbitMQ Management)Отсутствует встроенное решение; используются сторонние инструменты
Сценарии использованияФоновые задачи, микросервисы, системы уведомленийПотоковая аналитика, логирование, мониторинг, IoT
Примеры задачОтправка email, обработка заказов, рассылка уведомленийСбор и анализ логов, мониторинг событий, обработка данных в реальном времени

Сценарии применения

Асинхронная обработка

  • Отправка электронной почты после регистрации без блокировки основного потока.
  • Генерация отчётов в фоновом режиме.

Согласование распределённых транзакций

  • Сага-паттерн: компенсирующие операции при частичном сбое.
  • Событийная архитектура для поддержания согласованности между контекстами.

Буферизация между системами

  • Сглаживание различий в скорости обработки между высоконагруженным фронтендом и медленным бэкендом.
  • Интеграция систем с разной доступностью.

Широковещательные уведомления

  • Рассылка изменений конфигурации всем экземплярам сервиса.
  • Инвалидация кэша при изменении данных.