AMQP: подтверждение и предварительная выборка
Я пытаюсь понять некоторые аспекты протокола AMQP. В настоящее время у меня есть проект с RabbitMQ и использовать библиотеку python pika. Таким образом, вопрос касается подтверждения и предварительной выборки сообщений.
рассмотрим, что у нас есть очередь только с потребителем (наверняка эта очередь была объявлена как эксклюзивная). Так правильно ли я понимаю: независимо от того, потребляю ли я с флагом ack или без него? Во всяком случае, я не должен обрабатывать несколько сообщений одновременно, и нет другого потребители, которые могут принимать некоторые из других все еще стоящих в очереди сообщений. Даже лучше не сворачивать acknowledement, потому что, возможно, это может снизить нагрузку на сервер протокола AMQP.
prefetch count ничего не значит, если нет подтверждения. Правильно?
Я не уверен, как он работает. У меня есть обратный вызов на новое сообщение и в его наконец-то заявление я подтверждаю или отклоняю сообщение. Это единственная функция и независимо от того, насколько большой prefetch count будет - в любом случае другое сообщение не будет обработано до завершения текущего. Итак, почему мне нужно изменить значение prefetch_count?
спасибо заранее.
1 ответов
С autoack
флаг unset, если ваше приложение не удалось во время обработки сообщений все полученные сообщения будут потеряны. Если такая ситуация довольно редка, и потеря сообщения является подходящей опцией в вашем приложении (например, но не ограничиваясь обработкой журналов), вы можете отключить autoack.
и да, имея autoack
unset требует более простой логики брокера, поэтому он использует меньше ресурсов.
как prefetch count
(и prefetch size
), эти опции говорят брокеру, насколько велика может быть полезная нагрузка, отправленная клиенту заранее в одно сообщение. Обычно он используется для экономии времени на сетевых операциях в ожидании новых сообщений. Когда prefetch size
используемый клиент получит одно или несколько сообщений, общий размер которых равен или меньше предустановленного размера pretch (и / или count, который меньше).
и prefetch count
и prefetch size
правил они применяются. Когда один из них установлен в ноль (unset), он не будет применен.
самое главное предвыборка определяет поведение, чтобы отправлять сообщения заранее, еще сообщение о том, что клиент имеет unacked.
в сочетании эти две настройки производят что-то вроде этого:
предварительная выборка с ограничением количества сообщений и отправка сообщений заранее:
условия:
- очереди: N сообщений x 1kb
-
предвыборки:
prefetch-size=5kb, prefetch-count=4
-
Autoack:
off
документооборот:
- Брокер отправляет 4 сообщения (ограничен
prefetch-count=4
) для клиента. 4 сообщения будут помечены как un-acked и перемещены из очереди (поэтому они не будут доставлены другим клиентам). - сообщение клиента ack 1.
- брокер имеет -1 распакованное сообщение (удалить это сообщение) и отправить еще 1 сообщение клиенту (+1 un-aked, -1 из очереди, в то время как клиент уже имеет 3 сообщения un-acked).
- клиент ack остальные 3 сообщения + новое доставлено одно.
- брокер имеет -4 сообщения un-acked и снова отправляет 4 сообщения, +4 un-aked, -4 из очереди.
- сообщение клиента ack 1 и сбой.
- брокер будет -1 un-acked, а затем переместит остальные un-acked в очередь назад, поэтому -3 un-aked и +3 очереди, поэтому они могут быть доставлены тому или иному клиенту снова.
предварительная выборка с большие сообщения:
условия:
- очереди: 1 сообщение x 5Kb, N сообщений x 1kb
-
предвыборки:
prefetch-size=5kb, prefetch-count=2
-
Autoack:
off
документооборот:
- Брокер отправляет 1 сообщение (ограничен
prefetch-size=5kb
) клиенту и это сообщение, помеченное как un-aked. - сообщение клиента ack 1.
- брокер имеет -1 сообщений без acked, отправить 2 сообщения снова (ограничено
prefetch-count=2
, обратите внимание, что только первое сообщение было 5kb, остальные-1kb), и эти сообщения отмечены как un-acked. - сообщение клиента ack 1 и сбой.
- брокер будет перемещать сообщение acked из очереди сообщений, а остальные сообщения un-acked будут снова перемещены в очередь, к которой они принадлежат, поэтому они могут быть доставлены тому или иному клиенту снова.
С auto-ack:
условия:
- очереди: N сообщений x 1kb
-
предвыборки:
prefetch-size=5kb, prefetch-count=10
-
Autoack:
on
документооборот:
- , а как
prefetch-size
иprefetch-count
игнорируется, еслиno-ack
установить значение true (то есть, как функция auto-ack вызывается в RabbitMQ и в документах AMQP), сообщения будет отправлен клиенту один за другим и удален из очереди после успешной отправки.
обратите внимание, что AMQP имеет асинхронную архитектуру, поэтому при определенных условиях два клиента могут получать одно сообщение одновременно. Также un-acked сообщение может быть доставлено тому же клиенту обратно (особенно если у вас есть один клиент).
кроме того, посмотрите на prefetch-size
и prefetch-count
официальная документация и немного поэкспериментируйте с этими опции.
П. С.: autoack
в основном no-ack
флаг AMQP установлен в true
.