Как используется RabbitMQ в проектах
Что проверяют
Знаете ли вы, какие задачи он решает, и настраивали ли его всерьёз.
Как отвечать
Расскажите через сценарии применения.
- вынос долгой работы из запроса: генерация документа, обработка загруженного файла, рассылка. Пользователь получает ответ сразу, работа выполняется отдельно;
- интеграция между сервисами: событие публикуется, заинтересованные подписываются. Добавить нового потребителя можно без правки отправителя;
- сглаживание пиков: очередь принимает всплеск, а обработчики разбирают его в своём темпе;
- отложенные и повторяющиеся задачи: напоминания, повторные попытки.
В экосистеме Java это обычно Spring AMQP: шаблон для отправки и аннотация слушателя для приёма, с автоматическим преобразованием сообщений.
Что настраивают на практике, и это отличает опыт от знакомства:
- предвыборка: сколько неподтверждённых сообщений отдаётся одному потребителю. Без ограничения первый же обработчик заберёт всю очередь, и распределения не выйдет;
- подтверждения: ручное подтверждение после успешной обработки, иначе сообщение теряется при падении обработчика;
- очередь неразобранного: куда уходит сообщение после исчерпания попыток. Без неё битое сообщение возвращается в очередь бесконечно и блокирует обработку остальных;
- повторы с задержкой: обычно через обменник с отложенной доставкой, потому что мгновенный повтор при недоступности соседа бесполезен;
- долговечность: очередь долговечная и сообщения сохраняемые, иначе перезапуск брокера всё сотрёт.
Проблемы, с которыми сталкиваются: дубли при повторной доставке, поэтому обработчик обязан быть идемпотентным; порядок сообщений, который не гарантирован при нескольких потребителях; рост очереди, за которым надо следить как за метрикой здоровья системы.
Где спотыкаются
Не ограничивают предвыборку.
Подтверждают сообщение до обработки и теряют его при сбое.
Не заводят очередь неразобранного и получают бесконечный цикл повторов.
Не делают обработчик идемпотентным.