Как @RabbitListener работает с ack и зачем нужен prefetch?
- Как @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 в коде, когда обработка асинхронная
Подробно
Режимы подтверждения (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 по умолчанию и получить бесконечный цикл.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ack шифрует сообщение, а prefetch задаёт порядок обработки очередей
- ✗Ack удаляет очередь целиком
- ✓Ack подтверждает обработку, prefetch ограничивает неподтверждённые у consumer
- ✗Prefetch задаёт порядок очередей
Что спросят дальше
- Что такое manual ack?
- Как настроить DLX?
Разбор темы
- Spring AMQP и RabbitMQ
RabbitTemplate, @RabbitListener, exchanges, bindings, manual ack, retries, DLQ и prefetch.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.