Слушатель RabbitMQ при ошибке обработки делает nack с requeue = true. Чем это опасно?
- Что делать с ядовитым сообщением в RabbitMQ?
Брокер вернёт сообщение немедленно и без задержки — ядовитое сообщение крутится в бесконечном цикле, нагружает CPU и брокер, задерживает остальные.
- Постоянные ошибки — reject без requeue → DLX (x-dead-letter-exchange)
- Временные — повторы с отсрочкой (retry interceptor, TTL-очередь с DLX)
default-requeue-rejected=falseв Spring AMQP
А ещё Ограничение доставок — x-delivery-limit в quorum queues
Подробно
Различайте характер ошибки. Временный сбой (недоступна база) действительно имеет смысл повторить, но с задержкой и ограничением попыток. Ошибка в самих данных при повторе воспроизведётся всегда, поэтому такое сообщение нужно убирать из потока. Стандартное решение — nack с requeue = false и настроенный dead-letter exchange: сообщение уходит в отдельную очередь, где его можно разобрать вручную, не блокируя обработку остальных. Отложенные повторы делают через очередь с TTL и dead-lettering обратно либо средствами Spring Retry в слушателе. В Spring AMQP по умолчанию неперехваченное исключение как раз приводит к отклонению без возврата, и это разумное умолчание.
Что хотят услышать
- Почему цикл.
- DLX и повторы с отсрочкой.
Частые ошибки
- Возвращать в очередь сообщение с невалидными данными.
- Настраивать повторы без ограничения числа попыток.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Сообщение будет потеряно, так как requeue отменяет доставку
- ✗Ничем: брокер сам добавит нарастающую задержку перед повторной доставкой
- ✗Очередь будет автоматически удалена после трёх попыток
- ✓Сообщение тут же приходит снова: устойчивая ошибка даёт бесконечный цикл
Что спросят дальше
- Как сделать отложенный повтор через TTL и DLX?
- Как отличить временную ошибку от постоянной в коде слушателя?
Разбор темы
- Spring AMQP и RabbitMQ
RabbitTemplate, @RabbitListener, exchanges, bindings, manual ack, retries, DLQ и prefetch.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.