我试图理解AMQP协议的一些方面。目前我有一个RabbitMQ项目,使用python pika库。所以问题是确认和消息预取。
假设我们有一个只有consumer的队列(确保这个队列被声明为exclusive)。所以我是否正确理解了:无论我是使用ack标志还是不使用ack标志消费?无论如何,我不应该能够同时处理多个消息,并且没有其他消费者可以接受其他一些仍然排队的消息。最好不要打开确认,因为这可能会减少AMQP服务器的负载。
如果没有确认,那么预取计数就没有任何意义。对的?
我不知道预取是如何工作的。我对新消息有一个回调,在它的finally语句中,我确认或拒绝该消息。这是唯一的函数,无论预取计数有多大-无论如何,在当前消息完成之前,不会处理其他消息。为什么我需要更改预取计数值?
提前谢谢。
未设置
autoack
标志时,如果应用程序在消息处理期间失败,则所有接收到的消息都将丢失。如果这种情况非常罕见,并且消息丢失是应用程序中的适当选项(例如,但不限于日志处理),则可以关闭自动确认。是的,取消设置
autoack
需要更简单的代理逻辑,因此它使用更少的资源。至于
prefetch count
(和prefetch size
),这些选项告诉代理提前发送给客户端的单个消息的有效负载可能有多大。通常用于节省网络操作等待新消息的时间。当prefetch size
使用的客户端将接收一个或多个总大小等于或小于预设的pretch大小(和/或count,小于等于)的消息。应用它们设置的
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
和prefetch-count
设置为true(即在RabbitMQ和AMQP文档中如何调用auto ack功能)时,忽略了这两个选项,但消息将逐个发送到客户端,并在成功发送后从队列中删除。注意,AMQP具有异步体系结构,因此在某些情况下,两个客户机可能同时接收单个消息。也可以将未确认的消息传递回同一个客户端(特别是如果您只有一个客户端)。
另外,查看^{} 和^{} 官方文档,并对这些选项进行一些尝试。
p.S.:
autoack
基本上是no-ack
AMQP标志设置为true
。相关问题 更多 >
编程相关推荐