#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), как правило, не является хорошей идеей.