Отправляются ли сообщения потребителю все сразу, если я установлю autoAck=true?

#rabbitmq #spring-amqp

#rabbitmq #spring-amqp

Вопрос:

В нем есть очередь с 10000 сообщениями. Когда я запускаю потребителя (autoack= true), я вижу, rabbitmq_management что количество сообщений быстро становится равным нулю. Означает ли это, что все 10000 сообщений находятся на стороне потребителя? Где он хранится (я использую Spring-AMQP )? Если параллелизм моей конфигурации потребителя равен 1, а обработка сообщения занимает много времени, возможно ли исчерпание памяти (если количество сообщений очень велико)?

Ответ №1:

Это зависит от того, что вы имеете в виду; если вы используете basicConsume напрямую, все они будут отправлены.

Spring имеет несколько иную интерпретацию; режим ack NONE означает RabbitMQ autoAck (in basicConsume ). АВТО означает подтверждение контейнера после нормального завершения прослушивания. РУКОВОДСТВО означает, что пользовательский код отвечает за подтверждение.

С Spring режим подтверждения NONE также зависит от контейнера; с SimpleMessageListenerContainer помощью, prefetchCount будут отправляться только сообщения. Чтобы предотвратить условия ООМ, внутренняя очередь блокирует доставку дополнительных сообщений до тех пор, пока прослушиватель не обработает текущее сообщение.

С DirectMessageListenerContainer помощью они все будут отправлены потребителю, как при использовании basicConsume изначально.

RabbitMQ autoAck обычно не рекомендуется, поскольку это может привести к потенциальной потере сообщений.

Комментарии:

1. Что only prefetchCount messages will be sent означает третий абзац? Из rabbitmq_management я вижу, что количество сообщений быстро становится равным нулю SimpleMessageListenerContainer , а режим подтверждения ОТСУТСТВУЕТ.

2. С точки зрения Spring, BlockingQueue между потоком доставки и потоком прослушивателя существует a; его размер определяется при предварительной выборке с 1.3.x (2013) — конечно, тогда это останавливало доставку, если слушатель не мог идти в ногу. Это позволило избежать ошибок ООМ для некоторых пользователей, использующих NONE (autoAck). Предварительная выборка по умолчанию равна 250. Если вы этого не видите, то в коде amqp-клиента может быть дополнительная буферизация, которая находится вне нашего контроля. Я знаю, что за эти годы они внесли некоторые изменения в потоки, так что это вполне возможно. Как я уже сказал, autoAck (NONE), как правило, не является хорошей идеей.