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

Advanced Message Queuing Protocol

Advanced Message Queuing Protocol (AMQP) — это открытый протокол прикладного уровня для передачи сообщений между компонентами распределённых информационных систем, обеспечивающий гарантированную доставку, маршрутизацию, безопасность и транзакционность сообщений. AMQP стандартизирует взаимодействие между брокерами сообщений и клиентами, независимо от языка программирования и операционной системы. Протокол определён как международный стандарт ISO/IEC 19464:2014 и OASIS Standard.

История

Разработка AMQP началась в 2003 году в финансовом секторе. Компании JPMorgan Chase, iMatix Corporation, Red Hat, Cisco Systems, Microsoft и другие объединились для создания протокола, который бы решал проблемы совместимости между различными системами обмена сообщениями (например, IBM MQ, TIBCO Rendezvous, Microsoft MSMQ). Первая версия спецификации (AMQP 0-8) была опубликована в июне 2006 года. Версия 0-9-1 (2008 год) стала наиболее распространённой, хотя и неполной с точки зрения модели протокола.

В 2011 году была выпущена версия AMQP 1.0, которая кардинально отличалась от предыдущих. Она была принята как стандарт OASIS в 2012 году, а затем как ISO/IEC 19464:2014. AMQP 1.0 является единственной версией, получившей статус международного стандарта. Разработкой и поддержкой протокола занимается технический комитет OASIS AMQP.

Архитектура и модель протокола

AMQP определяет два уровня:

Транспортный уровень

Отвечает за передачу данных по сети, управление соединениями, сессиями и каналами. Использует TCP/IP в качестве транспортного протокола. Обеспечивает:

  • Соединение (Connection) — постоянное TCP-соединение между клиентом и брокером.
  • Сессия (Session)логический канал внутри соединения для упорядоченной передачи сообщений.
  • Канал (Channel) — мультиплексирование нескольких независимых потоков сообщений в рамках одной сессии.

Функциональный уровень

Определяет модель обмена сообщениями, включая:

  • Сообщение (Message) — единица данных, состоящая из заголовков, свойств и тела (произвольного формата).
  • Узел (Node) — точка назначения или источник сообщений (очередь, топик, обменник).
  • Ссылка (Link) — однонаправленное соединение между узлами (источником и получателем).

Типы обмена сообщениями

AMQP поддерживает три основные модели обмена:

1. Очередь (Queue)

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

2. Топик (Topic)

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

3. Обменник (Exchange) — специфическая концепция AMQP 0-9-1

Обменник принимает сообщения от издателей и направляет их в одну или несколько очередей на основе правил маршрутизации. Существуют типы обменников:

  • Direct — сообщение направляется в очередь, если ключ маршрутизации совпадает с ключом привязки очереди.
  • Fanout — сообщение копируется во все привязанные очереди.
  • Topic — маршрутизация по шаблону ключа (например, logs.*).
  • Headers — маршрутизация на основе заголовков сообщения.

В AMQP 1.0 модель обменников заменена более гибкой моделью ссылок и узлов.

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

AMQP предоставляет три уровня гарантий доставки сообщений:

УровеньОписание
At-most-onceСообщение доставляется не более одного раза. Возможна потеря при сбое.
At-least-onceСообщение доставляется хотя бы один раз. Возможны дубликаты.
Exactly-onceСообщение доставляется ровно один раз. Требует подтверждений и транзакций.

Гарантии реализуются через механизмы подтверждений (acknowledgements), транзакций и распределённых транзакций (XA).

Транзакции и безопасность

Транзакции

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

Безопасность

Версии протокола

AMQP 0-9-1

  • Наиболее распространённая версия в коммерческих и открытых брокерах (RabbitMQ, Apache Qpid).
  • Определяет модель обменников, очередей и привязок.
  • Не является полным стандартом — спецификация описывает только поведение, но не формат данных.
  • Поддерживает только клиент-серверную модель.

AMQP 1.0

  • Единственная версия, принятая как международный стандарт (ISO/IEC 19464:2014).
  • Отказывается от модели обменников в пользу более гибкой модели ссылок.
  • Поддерживает peer-to-peer взаимодействие (без обязательного брокера).
  • Определяет строгий двоичный формат сообщений.
  • Поддерживается в Apache ActiveMQ, Apache Qpid, Microsoft Azure Service Bus, IBM MQ (начиная с версии 9.0).

Реализации

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

  • RabbitMQ — наиболее популярный брокер, поддерживающий AMQP 0-9-1 (с плагином для AMQP 1.0).
  • Apache ActiveMQ — поддерживает AMQP 1.0.
  • Apache Qpid — реализация AMQP 1.0 на Java и C++.
  • Microsoft Azure Service Bus — облачный брокер, поддерживающий AMQP 1.0.
  • IBM MQ — коммерческий брокер, поддерживающий AMQP 1.0.

Клиентские библиотеки

AMQP поддерживается практически всеми популярными языками программирования: Java, Python, C++, C#, Ruby, PHP, JavaScript, Go, Rust и другими. Библиотеки реализуют как AMQP 0-9-1 (например, pika для Python), так и AMQP 1.0 (например, qpid-proton для C++).

Применение

AMQP широко используется в:

  • Финансовых системах — биржевые торги, платежные системы, обработка транзакций.
  • Интернете вещей (IoT) — передача данных от датчиков и устройств.
  • Микросервисной архитектуре — асинхронное взаимодействие между сервисами.
  • Облачных вычислениях — интеграция облачных сервисов (Azure, AWS, Google Cloud).
  • Промышленной автоматизации — системы управления производством (MES, SCADA).

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

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

  • Открытый стандарт, не зависящий от вендора.
  • Высокая производительность и низкая задержка.
  • Гарантированная доставка и транзакционность.
  • Поддержка множества языков и платформ.
  • Возможность работы через брандмауэры (использует TCP-порт 5672, для TLS — 5671).

Недостатки

  • Сложность реализации полной спецификации (особенно AMQP 1.0).
  • Необходимость настройки брокера и политик доставки.
  • Отсутствие встроенной поддержки потоковой передачи данных (в отличие от MQTT).
  • Меньшая распространённость по сравнению с HTTP/REST для простых сценариев.

Сравнение с другими протоколами

ПротоколМодельГарантии доставкиТипичное применение
AMQPОчереди, топики, обменникиAt-most-once, At-least-once, Exactly-onceФинансы, микросервисы, IoT
MQTTПубликация/подпискаAt-most-once, At-least-onceIoT, встроенные системы
STOMPТекстовая модельAt-most-once, At-least-onceВеб-приложения, простые сценарии
JMSJava-специфичныйAt-most-once, At-least-onceJava-экосистема

Интересные факты

  • AMQP 0-9-1 не является стандартом — это де-факто спецификация, используемая RabbitMQ.
  • Разработка AMQP 1.0 заняла более 5 лет из-за разногласий между участниками консорциума.
  • Протокол поддерживает передачу сообщений размером до 2^64 байт (16 эксабайт).
  • В 2020 году RabbitMQ объявил о планах полной поддержки AMQP 1.0 (реализовано в версии 3.12, выпущенной в 2023 году).

Источники

  1. OASIS Standard: Advanced Message Queuing Protocol (AMQP) Version 1.0, 2012.
  2. ISO/IEC 19464:2014 — Information technology — Advanced Message Queuing Protocol (AMQP).
  3. RabbitMQ Documentation — AMQP 0-9-1 Model Explained.
  4. Apache Qpid Documentation — AMQP 1.0 Overview.
  5. Microsoft Azure Service Bus — AMQP 1.0 Support.
  6. IBM MQ Knowledge Center — AMQP 1.0 Support.

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

На главную BFOmetr →