我尝试了解AMQP协议(protocol)的某些方面。目前,我有RabbitMQ项目,并使用python pika库。因此,问题在于确认和消息预取。
提前致谢。
最佳答案
在未设置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 count
和prefetch size
规则都将应用。当其中之一设置为零(未设置)时,将不会应用。
最重要的是,预取定义了在客户端未确认的更多消息之前先发送消息的行为。
结合使用这两个设置会产生如下内容:
预先获取消息数限制并提前发送消息:
使适应:
prefetch-size=5kb, prefetch-count=4
off
工作流程:
prefetch-count=4
限制)。 4条消息将被标记为未确认并从队列中移出(因此它们不会传递给其他客户端)。 带有大消息的预取:
使适应:
prefetch-size=5kb, prefetch-count=2
off
工作流程:
prefetch-size=5kb
限制),并且该消息标记为未屏蔽。 prefetch-count=2
限制,请注意,只有第一条消息为5kb,其余为1kb),并且这些消息标记为未确认。 带有自动确认:
使适应:
prefetch-size=5kb, prefetch-count=10
on
工作流程:
prefetch-size
设置为true时,尽管prefetch-count
和no-ack
都被忽略(这是RabbitMQ和AMQP文档中调用的自动确认功能的方式),但是消息将被一对一发送到客户端,并在成功发送后从队列中删除。 注意,AMQP具有异步体系结构,因此在某些情况下,两个客户端可以同时接收一条消息。还可以将未确认的消息发送回相同的客户端(特别是如果您有单个客户端)。
另外,请查看
prefetch-size
和 prefetch-count
官方文档,并尝试使用这些选项。附言:
autoack
基本上是no-ack
AMQP标志,设置为true
。
关于python - AMQP:确认和预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21652517/