RabbitMQ
RabbitMQ — брокер сообщений, реализация AMQP 0-9-1. Написан на Erlang (2007). Traditional message queue: producer → exchange → queue → consumer. В отличие от Kafka, сообщения удаляются после ack.
Модель
[Producer] → [Exchange] → routing → [Queue] → [Consumer]
│
(по типу exchange)
Типы exchange
| Тип | Как роутит |
|---|---|
| direct | по точному routing_key |
| fanout | во ВСЕ привязанные очереди |
| topic | по паттерну logs.*.error |
| headers | по matchу header'ов |
Пример роутинга
# binding: queue "errors" ← exchange "logs" с routing_key "*.error"
publish(exchange="logs", routing_key="app.error", body="failed")
→ попадает в queue "errors"
publish(exchange="logs", routing_key="app.info", body="ok")
→ в "errors" НЕ попадает
Гарантии
- Publisher confirms — broker подтверждает получение
- Consumer ack — сообщение удаляется только после ack
- Persistent messages — на диск
- Durable queues — переживают рестарт
Dead letter
Сообщение отклонено (nack), TTL истёк, очередь переполнена — уходит в DLX (dead letter exchange). Классика для ретраев и разбора инцидентов.
Кластеризация
- Classic mirrored queues (deprecated, 3.13-)
- Quorum queues — Raft-based, современный default
- Streams (RabbitMQ 3.9+) — Kafka-подобный лог
RabbitMQ vs Kafka
| RabbitMQ | Kafka | |
|---|---|---|
| Модель | очередь (удаляет) | лог (хранит) |
| Throughput | 50k-100k msg/s | 1M+ msg/s |
| Роутинг | гибкий | по partition/key |
| Message priority | да | нет |
| Delayed delivery | plugin | нет |
| Реплей | нет | да |
| Кому | task queues, RPC | event streaming, log |
Плагины
- Management — web UI
- MQTT, STOMP, Web-STOMP, Federation, Shovel
- Delayed Message — планированная доставка