Для чего используется RabbitMQ
Что проверяют
Понимаете ли вы модель маршрутизации через обменники и знаете ли, чем он отличается от Kafka.
Как отвечать
RabbitMQ это брокер сообщений, реализующий протокол AMQP. Задача та же, что у любой очереди: развязать отправителя и получателя во времени, сгладить пик нагрузки, вынести долгую работу из цикла запроса.
Модель, которую надо назвать, потому что она отличает его от других брокеров: отправитель публикует не в очередь, а в обменник. Обменник по ключу маршрутизации и привязкам решает, в какие очереди положить сообщение. Типы обменников:
- direct: точное совпадение ключа;
- topic: шаблоны с подстановками, например
order.*.created; - fanout: копия во все привязанные очереди;
- headers: маршрутизация по заголовкам.
Надёжность собирается из трёх частей и работает только целиком: очередь объявлена долговечной, сообщение помечено как сохраняемое, потребитель подтверждает обработку. Плюс подтверждения от брокера отправителю, чтобы тот знал, что сообщение принято.
Что обязательно настраивают на практике:
- предвыборка (prefetch): сколько неподтверждённых сообщений отдавать одному потребителю. Без ограничения первый же потребитель заберёт всю очередь, и распределения не получится;
- очередь неразобранного через обменник для отклонённых сообщений, иначе битое сообщение будет возвращаться в очередь бесконечно;
- срок жизни сообщения и отложенная доставка для повторов с задержкой.
Отличие от Kafka: в RabbitMQ сообщение удаляется после подтверждения, перечитать историю нельзя, зато маршрутизация гибче и есть приоритеты. Kafka это журнал со смещениями, где сообщение лежит до истечения срока хранения и его читают несколько независимых групп.
В Python обычно встречается как брокер для Celery, а напрямую через pika или aio-pika.
Где спотыкаются
Считают, что отправитель пишет прямо в очередь.
Настраивают долговечную очередь, но забывают про сохраняемость сообщений.
Не ограничивают предвыборку и получают неравномерную нагрузку.
Не делают обработчик идемпотентным, хотя повторная доставка возможна всегда.