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

Как @RabbitListener работает с ack и зачем нужен prefetch?

MiddleSpring AMQP и RabbitMQRabbitMQ
Ещё спрашивают так:
  • Как @RabbitListener подтверждает сообщения?
Коротко

Контейнер вызывает метод @RabbitListener и в режиме AUTO сам подтверждает сообщение (ack) после успешного выхода из метода, а при исключении — nack (по умолчанию с возвратом в очередь). Prefetch — сколько неподтверждённых сообщений получает каждый потребитель.

  • Requeue при постоянной ошибке — бесконечный цикл: default-requeue-rejected=false или AmqpRejectAndDontRequeueException → DLX
  • Повторы с отсрочкой — retry interceptor (spring.rabbitmq.listener.simple.retry)
  • Prefetch по умолчанию 250; маленький — справедливее для долгих задач

А ещё MANUAL ack — channel.basicAck в коде, когда обработка асинхронная

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

Подробно

Режимы подтверждения (acknowledge-mode):

  • AUTO (по умолчанию) — успех метода → ack; исключение → reject. По умолчанию с requeue=true: сообщение возвращается в очередь и сразу приходит снова;
  • MANUAL — подтверждать вручную через Channel.basicAck/basicNack;
  • NONE — брокер считает сообщение доставленным сразу (возможна потеря).

Ядовитые сообщения. Если ошибка постоянная (невалидные данные), requeue=true даёт бесконечный цикл с загрузкой CPU. Решения:

  • spring.rabbitmq.listener.simple.default-requeue-rejected=false — отвергнутые не возвращаются, а уходят в DLX, если она настроена на очереди (x-dead-letter-exchange);
  • бросать AmqpRejectAndDontRequeueException для постоянных ошибок;
  • stateless retry: listener.simple.retry.enabled=true, max-attempts, initial-interval, multiplier — повторы в потребителе с отсрочкой, а после — recoverer (по умолчанию reject → DLX).

Prefetch (listener.simple.prefetch, по умолчанию 250) — лимит неподтверждённых у потребителя. Большой — высокая пропускная способность для быстрых задач; для долгих задач один потребитель заберёт много сообщений и будет их долго держать, пока другие простаивают, — ставят 1–10.

Параллелизм: concurrency / max-concurrency — число потребителей в контейнере.

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

  • Режимы ack и поведение AUTO при исключении.
  • Проблема requeue и решение через DLX и retry.
  • Prefetch и его влияние.

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

  • Оставить requeue по умолчанию и получить бесконечный цикл.

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

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

Показать варианты и ответ
  • ✗Prefetch шифрует сообщения
  • ✓Ack/nack подтверждают или отклоняют обработку (manual или auto), а prefetch ограничивает число неподтверждённых сообщений у consumer
  • ✗Ack удаляет очередь целиком
  • ✗Prefetch задаёт порядок очередей

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

  • Что такое manual ack?
  • Как настроить DLX?

Разбор темы

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

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

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

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

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