AMQP
AMQP (Advanced Message Queuing Protocol) — открытый бинарный протокол для message brokers. Разработан JPMorgan Chase (2003), потом OASIS. Две несовместимые версии: AMQP 0-9-1 (RabbitMQ) и AMQP 1.0 (Azure, ActiveMQ, Solace).
0-9-1 vs 1.0 (внимание, разные)
| AMQP 0-9-1 | AMQP 1.0 | |
|---|---|---|
| Год | 2008 | 2011 (ISO 2014) |
| Модель | exchange+queue+binding | link → node |
| Broker обязателен | да | нет (P2P возможно) |
| Использует | RabbitMQ | Azure Service Bus, ActiveMQ Artemis, Solace |
Совместимости между ними — нет. Клиент 0-9-1 не подключится к 1.0-серверу.
AMQP 0-9-1 модель
[Producer] → [Exchange] → binding(routing_key) → [Queue] → [Consumer]
Термины: connection (TCP), channel (мультиплексор внутри connection), exchange, queue, binding, routing key, consumer.
Class + Method + Frame
# frame types
1 = METHOD
2 = HEADER
3 = BODY
4 = HEARTBEAT
# frame формат
| type:byte | channel:short | size:long | payload | 0xCE |
# method example: basic.publish
class-id=60 (basic), method-id=40 (publish)
exchange:"logs"
routing-key:"error"
mandatory:1
immediate:0
Handshake
C → S: "AMQP\0\0\9\1" # magic
S → C: connection.start
C → S: connection.start-ok (auth)
S → C: connection.tune (max-channel, frame-max, heartbeat)
C → S: connection.tune-ok
C → S: connection.open (vhost="/")
S → C: connection.open-ok
# теперь channel.open, basic.publish, ...
AMQP 1.0 модель
Не exchange/queue — вместо этого links к nodes. Sender attaches link к node, шлёт сообщения. Более гибко, но иная семантика.
Session (мультиплексор)
├── Sender-link → target="queue-A"
└── Receiver-link ← source="queue-B"
Кто использует
- AMQP 0-9-1: RabbitMQ (главный)
- AMQP 1.0: Azure Service Bus, Azure Event Hubs, IBM MQ, Solace, ActiveMQ Artemis, Apache Qpid
Порт
- 5672 — plain AMQP
- 5671 — AMQPS (TLS)
Плюсы AMQP как стандарта
- Не привязан к вендору (по идее)
- Гибкая роутинг-модель
- Публикатор-подтверждения, транзакции
Минусы
- Сложный (десятки методов, encoding rules)
- Раскол 0-9-1 vs 1.0
- RabbitMQ практически монополист 0-9-1