AMQP: подтверждение и предварительная выборка

Я пытаюсь понять некоторые аспекты протокола AMQP. В настоящее время у меня есть проект с RabbitMQ и использовать библиотеку python pika. Таким образом, вопрос касается подтверждения и предварительной выборки сообщений.

  1. рассмотрим, что у нас есть очередь только с потребителем (наверняка эта очередь была объявлена как эксклюзивная). Так правильно ли я понимаю: независимо от того, потребляю ли я с флагом ack или без него? Во всяком случае, я не должен обрабатывать несколько сообщений одновременно, и нет другого потребители, которые могут принимать некоторые из других все еще стоящих в очереди сообщений. Даже лучше не сворачивать acknowledement, потому что, возможно, это может снизить нагрузку на сервер протокола AMQP.

  2. prefetch count ничего не значит, если нет подтверждения. Правильно?

  3. Я не уверен, как он работает. У меня есть обратный вызов на новое сообщение и в его наконец-то заявление я подтверждаю или отклоняю сообщение. Это единственная функция и независимо от того, насколько большой prefetch count будет - в любом случае другое сообщение не будет обработано до завершения текущего. Итак, почему мне нужно изменить значение prefetch_count?

спасибо заранее.

1 ответов


С autoack флаг unset, если ваше приложение не удалось во время обработки сообщений все полученные сообщения будут потеряны. Если такая ситуация довольно редка, и потеря сообщения является подходящей опцией в вашем приложении (например, но не ограничиваясь обработкой журналов), вы можете отключить autoack.

и да, имея autoack unset требует более простой логики брокера, поэтому он использует меньше ресурсов.

как prefetch countprefetch 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.