Как работает RabbitMQ, его внутренняя архитектура, основные элементы и типы обменников
Что проверяют
Знаете ли вы, что отправитель пишет не в очередь, и различаете ли типы обменников.
Как отвечать
Путь сообщения: отправитель публикует в обменник, тот по привязкам и ключу маршрутизации решает, в какие очереди положить копию, а получатели читают из очередей.
Элементы:
- виртуальный хост: изолированное пространство имён с собственными правами. Так на одном кластере живут разные окружения;
- соединение и каналы: приложение держит одно TCP-соединение, а работа идёт по логическим каналам поверх него. Создавать соединение на каждую операцию дорого, а канал дёшево. Важно: канал не потокобезопасен, у каждого потока должен быть свой;
- обменник, очередь, привязка;
- подтверждения: получатель подтверждает обработку, а отправитель может получать подтверждения от брокера.
Типы обменников:
- direct: сообщение уходит в очереди, чья привязка точно совпадает с ключом маршрутизации;
- topic: ключ разбит точками, привязка использует шаблоны, где символ звёздочки заменяет одно слово, а решётка любое число слов. Например
order.*.created; - fanout: копия во все привязанные очереди, ключ игнорируется. Классическое широковещание;
- headers: маршрутизация по заголовкам вместо ключа, применяется редко;
- обменник по умолчанию: безымянный, ведёт себя как direct, где ключ это имя очереди. Именно поэтому в простых примерах кажется, что публикуют прямо в очередь.
Надёжность собирается только целиком: долговечная очередь, сохраняемое сообщение, подтверждения с обеих сторон. Плюс ограничение предвыборки, иначе один получатель заберёт всю очередь.
Про кластер: современный отказоустойчивый вариант это кворумные очереди на алгоритме согласования Raft. Старые зеркальные очереди объявлены устаревшими.
Дополнительно настраивают обменник для отклонённых сообщений, срок жизни сообщения и ограничение длины очереди.
Где спотыкаются
Считают, что публикация идёт прямо в очередь.
Используют один канал из нескольких потоков.
Настраивают долговечность очереди, но не сохраняемость сообщений.
Путают topic и headers.