Получить доступ

Слушатель RabbitMQ при ошибке обработки делает nack с requeue = true. Чем это опасно?

MiddleSpring AMQP и RabbitMQRabbitMQ
Ещё спрашивают так:
  • Что делать с ядовитым сообщением в RabbitMQ?
Коротко

Брокер вернёт сообщение немедленно и без задержки — ядовитое сообщение крутится в бесконечном цикле, нагружает CPU и брокер, задерживает остальные.

  • Постоянные ошибки — reject без requeue → DLX (x-dead-letter-exchange)
  • Временные — повторы с отсрочкой (retry interceptor, TTL-очередь с DLX)
  • default-requeue-rejected=false в Spring AMQP

А ещё Ограничение доставок — x-delivery-limit в quorum queues

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Различайте характер ошибки. Временный сбой (недоступна база) действительно имеет смысл повторить, но с задержкой и ограничением попыток. Ошибка в самих данных при повторе воспроизведётся всегда, поэтому такое сообщение нужно убирать из потока. Стандартное решение — nack с requeue = false и настроенный dead-letter exchange: сообщение уходит в отдельную очередь, где его можно разобрать вручную, не блокируя обработку остальных. Отложенные повторы делают через очередь с TTL и dead-lettering обратно либо средствами Spring Retry в слушателе. В Spring AMQP по умолчанию неперехваченное исключение как раз приводит к отклонению без возврата, и это разумное умолчание.

Что хотят услышать

  • Почему цикл.
  • DLX и повторы с отсрочкой.

Частые ошибки

  • Возвращать в очередь сообщение с невалидными данными.
  • Настраивать повторы без ограничения числа попыток.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Сообщение возвращается в очередь и тут же приходит снова: при устойчивой ошибке получается бесконечный цикл, выжигающий CPU и забивающий логи
  • ✗Сообщение будет потеряно, так как requeue отменяет доставку
  • ✗Ничем: брокер сам добавит задержку перед повторной доставкой
  • ✗Очередь будет автоматически удалена после трёх попыток

Что спросят дальше

  • Как сделать отложенный повтор через TTL и DLX?
  • Как отличить временную ошибку от постоянной в коде слушателя?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем