Открыть сервис

Очереди сообщений

Очередь сообщений — это программный компонент, предназначенный для асинхронного обмена данными между различными частями распределённой информационной системы (приложениями, микросервисами, процессами). Очередь сообщений реализует шаблон проектирования «промежуточное программное обеспечение, ориентированное на обработку сообщений» (Message-Oriented Middleware, MOM), гарантируя, что отправитель и получатель не обязаны взаимодействовать напрямую и одновременно. Сообщение помещается в очередь отправителем и хранится в ней до тех пор, пока не будет извлечено и обработано получателем (или получателями). Это позволяет развязать компоненты системы по времени, снизить их взаимозависимость и повысить отказоустойчивость.

История

Концепция очередей сообщений восходит к 1960-м годам, когда в операционных системах мейнфреймов (например, IBM OS/360) появились механизмы межпроцессного взаимодействия, такие как каналы и очереди заданий. Однако как самостоятельный класс программного обеспечения очереди сообщений оформились в 1980-х годах с развитием распределённых вычислений и сетевых технологий. В 1983 году компания IBM выпустила продукт «IBM MQSeries» (позднее — IBM MQ), который стал одним из первых коммерческих брокеров сообщений. В 1990-х годах спецификация Java Message Service (JMS), разработанная компанией Sun Microsystems, стандартизировала программный интерфейс для работы с очередями сообщений в среде Java. В 2000-х годах с ростом популярности микросервисной архитектуры и облачных вычислений появились лёгкие и высокопроизводительные брокеры, такие как RabbitMQ (2007) и Apache Kafka (2011). В России очереди сообщений активно используются в банковском секторе, телекоммуникациях и государственных информационных системах, включая платформы «Гостех» и «СберТех».

Принцип работы

Очередь сообщений функционирует по принципу «производитель-потребитель» (producer-consumer). Производитель (отправитель) создаёт сообщение и отправляет его в очередь, не зная, кто и когда его обработает. Потребитель (получатель) подключается к очереди и извлекает сообщения для обработки. Брокер сообщений (сервер очереди) управляет хранением, маршрутизацией и доставкой сообщений.

Основные компоненты

  • Сообщение — структурированный блок данных, обычно содержащий заголовок (метаданные: идентификатор, тип, время отправки) и тело (полезная нагрузка, payload).
  • Очередь — буфер, в котором сообщения хранятся в порядке поступления (FIFO — First In, First Out) или в соответствии с приоритетом.
  • Брокер сообщений — серверное приложение, реализующее логику очереди, маршрутизацию и гарантии доставки.
  • Производитель — компонент, отправляющий сообщения в очередь.
  • Потребитель — компонент, получающий и обрабатывающий сообщения из очереди.

Модели доставки

  • Point-to-Point (P2P) — сообщение отправляется в очередь и обрабатывается ровно одним потребителем. После успешного извлечения сообщение удаляется из очереди. Эта модель используется для задач, где каждое сообщение должно быть выполнено однократно (например, обработка заказа).
  • Publish-Subscribe (Pub/Sub) — сообщение отправляется в топик (topic), и все подписанные на него потребители получают копию сообщения. Эта модель применяется для рассылки уведомлений или событий.

Типы и классификация

Очереди сообщений классифицируются по нескольким признакам.

По способу хранения

  • Временные (in-memory) — сообщения хранятся только в оперативной памяти брокера. Обеспечивают максимальную скорость, но теряются при сбое. Примеры: Redis Streams, ZeroMQ.
  • Постоянные (persistent) — сообщения дублируются на диск (журнал транзакций). Гарантируют сохранность данных при перезапуске, но медленнее. Примеры: Apache Kafka, RabbitMQ (с включённым persistence).

По протоколу обмена

  • AMQP (Advanced Message Queuing Protocol) — открытый стандарт, поддерживаемый большинством брокеров (RabbitMQ, Apache ActiveMQ). Обеспечивает маршрутизацию, транзакции и гарантии доставки.
  • MQTT (Message Queuing Telemetry Transport) — лёгкий протокол для IoT и мобильных устройств с низким энергопотреблением. Используется в системах «умный дом» и промышленной автоматизации.
  • STOMP (Streaming Text Oriented Messaging Protocol) — простой текстовый протокол, часто применяемый для интеграции с веб-приложениями.
  • Kafka Protocol — проприетарный протокол Apache Kafka, оптимизированный для потоковой обработки больших объёмов данных.

По модели потребления

  • Pull-модель — потребитель сам запрашивает сообщения из очереди. Используется в Apache Kafka и Amazon SQS. Позволяет потребителю контролировать скорость обработки.
  • Push-модель — брокер сам отправляет сообщения потребителю. Используется в RabbitMQ и ActiveMQ. Требует от потребителя постоянной готовности к приёму.

Применение

Очереди сообщений находят применение в широком спектре задач, где требуется асинхронное взаимодействие.

Микросервисная архитектура

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

Обработка событий

В системах реального времени (например, мониторинг, логирование, аналитика) очереди сообщений служат буфером для потоков событий. Apache Kafka, в частности, используется для построения конвейеров данных (data pipelines) и стриминговой обработки (например, в платформе «Яндекс.Облако»).

Управление задачами

Очереди сообщений применяются для распределения задач между рабочими процессами (workers). Например, в веб-приложениях длительные операции (отправка email, генерация отчётов) ставятся в очередь и выполняются асинхронно фоновыми процессами, не блокируя ответ пользователю.

Интеграция систем

Очереди сообщений выступают в роли промежуточного слоя при интеграции разнородных систем (ERP, CRM, базы данных). В России такие решения используются в платформах «1С:Предприятие» для обмена данными между конфигурациями.

Примеры популярных реализаций

RabbitMQ

Брокер сообщений с открытым исходным кодом, написанный на языке Erlang. Поддерживает протоколы AMQP 0-9-1, MQTT и STOMP. Отличается гибкой маршрутизацией (обменники, связки, очереди) и широкими возможностями мониторинга. Используется в проектах «Ростелекома» и «Сбербанка».

Apache Kafka

Распределённая платформа потоковой обработки данных, написанная на Scala и Java. Ориентирована на высокую пропускную способность (миллионы сообщений в секунду) и долговременное хранение логов. Используется для построения event-driven архитектур в «Тинькофф Банке» и «Яндексе».

Amazon Simple Queue Service (SQS)

Полностью управляемый облачный сервис очередей от Amazon Web Services. Поддерживает как стандартные очереди (высокая пропускная способность, возможна дупликация), так и очереди FIFO (гарантия однократной доставки). Популярен в международных проектах.

Redis Streams

Расширение Redis, реализующее очередь сообщений с поддержкой групп потребителей и постоянного хранения. Используется для высоконагруженных кэширующих и очередирующих решений.

Преимущества и недостатки

Преимущества

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

Недостатки

  • Сложность — требуется настройка брокера, мониторинг, обработка ошибок и повторных попыток.
  • Задержка — асинхронная обработка вносит дополнительную задержку по сравнению с синхронным вызовом.
  • Потеря сообщений — при неправильной конфигурации (например, отключении persistence) возможна потеря данных.
  • Идемпотентность — потребители должны быть спроектированы так, чтобы повторная обработка одного сообщения не приводила к ошибкам.

Сравнение с другими подходами

Очереди сообщений часто сравнивают с другими механизмами межпроцессного взаимодействия:

  • HTTP/REST — синхронный протокол, требующий прямой связи между сервисами. Очереди сообщений позволяют избежать блокировок и каскадных сбоев.
  • Базы данных — использование таблиц баз данных в качестве очередей (например, PostgreSQL с функцией LISTEN/NOTIFY) менее производительно и не предоставляет гарантий доставки, характерных для специализированных брокеров.
  • Потоковая обработка — системы вроде Apache Flink или Spark Streaming обрабатывают данные в реальном времени, но не предоставляют буферизации и гарантий доставки, свойственных очередям сообщений.

Источники

  1. Мартин Клеппман. «Высоконагруженные приложения. Программирование, масштабирование, поддержка» (Designing Data-Intensive Applications). — 2017.
  2. Документация RabbitMQ. — RabbitMQ.
  3. Документация Apache Kafka. — Apache Software Foundation.
  4. Спецификация Java Message Service (JMS) 2.0. — Oracle Corporation, 2013.
  5. Р. Д. Ширяев. «Архитектура корпоративных приложений». — 2020.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →