python - AMQP:确认和预取

标签 python rabbitmq amqp pika

我尝试了解AMQP协议(protocol)的某些方面。目前,我有RabbitMQ项目,并使用python pika库。因此,问题在于确认和消息预取。

  • 考虑我们只有一个使用者队列(请确保此队列被声明为独占队列)。所以我能正确理解吗:无论我是否使用带有或没有ack标志的消耗量?无论如何,我不应该能够同时处理多个消息,并且没有其他使用者可以接收其他一些仍在排队的消息。最好不要打开确认,因为这可能会减少AMQP服务器负载。
  • 如果没有确认,则预取计数没有任何意义。正确的?
  • 我不确定预取如何工作。我在新消息上有一个回调,在其最后的语句中,我确认或拒绝了该消息。这是唯一的功能,无论预取数量有多大-无论如何,直到当前消息完成后,其他消息才会被处理。那么,为什么我需要更改prefetch_count值?

  • 提前致谢。

    最佳答案

    在未设置autoack标志的情况下,如果您的应用程序在消息处理期间失败,则所有接收到的消息都将丢失。 If such situation is quite rare and message lose is appropriate option in your application (for example, but no limited to, logs processing) you may turn autoack off.

    是的,取消设置autoack需要更简单的代理逻辑,因此它占用的资源更少。

    对于prefetch count(和prefetch size),这些选项告诉代理预先将单个消息提前发送给客户端的有效负载有多大。通常,它用于节省网络操作等待新消息的时间。当使用prefetch size时,客户端将收到一条或多条消息,这些消息的总大小等于或小于预设的预取大小(和/或计数,较小)。

    设置的prefetch countprefetch size规则都将应用。当其中之一设置为零(未设置)时,将不会应用。

    最重要的是,预取定义了在客户端未确认的更多消息之前先发送消息的行为。

    结合使用这两个设置会产生如下内容:

    预先获取消息数限制并提前发送消息:

    使适应:

  • 队列:N条消息x 1kb
  • 预取:prefetch-size=5kb, prefetch-count=4
  • Autoack:off

  • 工作流程:
  • Broker向客户端发送4条消息(受prefetch-count=4限制)。 4条消息将被标记为未确认并从队列中移出(因此它们不会传递给其他客户端)。
  • 客户端确认1消息。
  • Broker具有-1条未确认的消息(删除该消息)并向客户端发送1条消息(+1未取消确认,从队列中为-1,而客户端已经有3条未确认消息)。
  • 客户端确认其余3条消息+新发送了1条消息。
  • Broker具有-4消息未确认,并再次发送4消息,+ 4未取消确认,-4从队列发送。
  • 客户端确认1消息,但失败。
  • Broker将-1取消确认,然后将其余未确认的内容移回队列,因此-3取消保留并且+3排队,因此它们可以再次传递给此客户端或其他客户端。

  • 带有大消息的预取:

    使适应:
  • 队列:1条消息x 5Kb,N条消息x 1kb
  • 预取:prefetch-size=5kb, prefetch-count=2
  • Autoack:off

  • 工作流程:
  • Broker向客户端发送1条消息(受prefetch-size=5kb限制),并且该消息标记为未屏蔽。
  • 客户端确认1消息。
  • Broker具有-1条未确认的消息,再次发送2条消息(受prefetch-count=2限制,请注意,只有第一条消息为5kb,其余为1kb),并且这些消息标记为未确认。
  • 客户端确认1消息,但失败。
  • Broker将把已确认的消息移出消息队列,其余未确认的消息将再次移到它们所属的队列中,因此它们可能会再次传递到此客户端或其他客户端。

  • 带有自动确认:

    使适应:
  • 队列:N条消息x 1kb
  • 预取:prefetch-size=5kb, prefetch-count=10
  • Autoack:on

  • 工作流程:
  • prefetch-size设置为true时,尽管prefetch-countno-ack都被忽略(这是RabbitMQ和AMQP文档中调用的自动确认功能的方式),但是消息将被一对一发送到客户端,并在成功发送后从队列中删除。

  • 注意,AMQP具有异步体系结构,因此在某些情况下,两个客户端可以同时接收一条消息。还可以将未确认的消息发送回相同的客户端(特别是如果您有单个客户端)。

    另外,请查看 prefetch-size prefetch-count 官方文档,并尝试使用这些选项。

    附言:autoack基本上是no-ack AMQP标志,设置为true

    关于python - AMQP:确认和预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652517/

    相关文章:

    python - 用gstreamer接收RTP流

    timestamp - RabbitMQ 3.1.3 和丢失的时间戳头

    java - Log4j + Amqp 日志示例代码失败

    zeromq - 使用 Zeromq 缓冲失效订阅者的消息

    python - 使用 sklearn.cluster Kmeans 时出现内存错误

    python - 用于测试字符串的可能值的有限调色板的正则表达式?

    java - 通过RabbitMQ维护correlationId

    java - 有序队列的多线程消费

    c# - 应用程序异常关闭时删除RabbitMQ Queue

    python - 在此示例中,为什么 RidgeCV 中的 alphas=alphas ?