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
- 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 framework (написан на C#), Python, Ruby и Zabbix.
AMQP (Advanced Message Queuing Protocol) и Kafka – это две различные технологии для обмена сообщениями в распределенных системах.
AMQP – это протокол обмена сообщениями, который обеспечивает надежную доставку сообщений между различными приложениями и сервисами. Он основан на модели сообщений и очередей, где отправители передают сообщения в очередь, а получатели забирают их оттуда, обеспечивая надежность и независимость от времени. AMQP обычно используется в корпоративных системах для обмена сообщениями между различными компонентами.
Kafka, с другой стороны, это распределенная система для потоковой обработки данных, которая обеспечивает высокую пропускную способность и надежную доставку сообщений. Он основан на концепции журнала изменений (log-based), где сообщения записываются в лог и удерживаются на протяжении определенного периода времени. Клиенты могут читать сообщения из лога и обрабатывать их согласно своим потребностям. Kafka обычно используется для обработки больших объемов данных и стриминговой обработки.
Таким образом, AMQP подходит для обмена сообщениями между приложениями, в то время как Kafka больше подходит для обработки данных в реальном времени и потоковой обработки. Выбор между этими двумя технологиями зависит от конкретных требований вашего проекта и того, какие задачи вы планируете решать с их помощью.