AMQP (Advanced Message Queuing Protocol) – это протокол для передачи сообщений между приложениями, который обеспечивает надежную доставку сообщений, управление очередями и другие функции для обеспечения эффективного обмена данными между различными системами. AMQP часто используется в распределенных системах и сетях для управления сообщениями и обмена данными между различными компонентами системы.
AMQP основан на трёх понятиях:
- Сообщение (message) — единица передаваемых данных, основная его часть (содержание) никак не интерпретируется сервером, к сообщению могут быть присоединены структурированные заголовки.
- Точка обмена (exchange) — в неё отправляются сообщения. Точка обмена распределяет сообщения в одну или несколько очередей. При этом в точке обмена сообщения не хранятся. Точки обмена бывают трёх типов:
- fanout — сообщение передаётся во все прицепленные к ней очереди;
- direct — сообщение передаётся в очередь с именем, совпадающим с ключом маршрутизации (routing key) (ключ маршрутизации указывается при отправке сообщения);
- topic — нечто среднее между fanout и direct, сообщение передаётся в очереди, для которых совпадает маска на ключ маршрутизации, например, app.notification.sms.# — в очередь будут доставлены все сообщения, отправленные с ключами, начинающимися с app.notification.sms.
- Очередь (queue) — здесь хранятся сообщения до тех пор, пока не будут забраны клиентом. Клиент всегда забирает сообщения из одной или нескольких очередей.
Протокол можно разделить на два слоя:
- Functional Layer – определяет набор команд которые выполняют работу от имени приложения.
- Transport Layer – обслуживает запросы приложения к серверу и сервера к приложению, управляет мультиплексированием каналов, фреймингом, кодировкой, heart-beating, представлением данныx, работой с ошибками.
Примеры очередей:
- store-and-forward-queue – хранит и распространяет сообщения для многих потребителей (consumers) по принципу round robin. Постоянные, публичные
- private reply queue – хранит и распространяет сообщения для одного потребителя (consumer). Временные, приватные
- private subscription queue – хранит сообщения от многих источников и отправляет одному потребителю (consumer). Временные, приватные
Протокол не ограничивается этими тремя видами. Они указаны как пример реализации.
Терминология
- Exchange – сущность которая получает сообщения от приложений и при необходимости перенаправляет их в очереди сообщений.
- Binding: отношение между очередью сообщений и точками обмена.
- Routing key: виртуальный адрес который точка обмена использует для принятия решения о дальнейшей маршрутизации.
Exchange
Каждый exchange реализует свой алгоритм маршрутизации. Существует несколько стандартных типов exchange, описанных в Functional Specification стандарта. Из них два являются важными:
- Direct exchange – маршрутизирует на основе routing key. Базовый exchange – это direct exchange
- topic exchange – маршрутизирует на основе шаблона маршрутизации.
Сервер создаст несколько exchange, включая direct и topic. Они будут иметь wellknown имена и клиентские приложения смогут работать с ними.
Routing Key
- Реализованный на C++ – высокая производительность, низкая латентность, а также поддержка RDMA
- Реализованный на Java – Полная JMS совместимость, запускается на любой платформе Java
Оба брокера сообщений AMQP поддерживают клиентов на множестве языков программирования если и сам клиент обмена сообщениями и соответствующий брокер поддерживают одну и ту же версию AMQP. Имеются клиентские библиотеки, написанные на C++, Java (JMS), .Net (написан на C#), Python, Ruby и Zabbix.