AMQP:确认和预取

2024-04-26 06:18:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解AMQP协议的一些方面。目前我有一个RabbitMQ项目,使用python pika库。所以问题是确认和消息预取。

  1. 假设我们有一个只有consumer的队列(确保这个队列被声明为exclusive)。所以我是否正确理解了:无论我是使用ack标志还是不使用ack标志消费?无论如何,我不应该能够同时处理多个消息,并且没有其他消费者可以接受其他一些仍然排队的消息。最好不要打开确认,因为这可能会减少AMQP服务器的负载。

  2. 如果没有确认,那么预取计数就没有任何意义。对的?

  3. 我不知道预取是如何工作的。我对新消息有一个回调,在它的finally语句中,我确认或拒绝该消息。这是唯一的函数,无论预取计数有多大-无论如何,在当前消息完成之前,不会处理其他消息。为什么我需要更改预取计数值?

提前谢谢。


Tags: 项目声明消息协议amqp队列consumer标志
1条回答
网友
1楼 · 发布于 2024-04-26 06:18:06

未设置autoack标志时,如果应用程序在消息处理期间失败,则所有接收到的消息都将丢失。如果这种情况非常罕见,并且消息丢失是应用程序中的适当选项(例如,但不限于日志处理),则可以关闭自动确认。

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

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

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

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

结合这两种设置,会产生如下结果:

使用消息计数限制预取并提前发送消息:

条件:

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

工作流程:

  • 代理向客户端发送4条消息(受prefetch-count=4限制)。4条消息将被标记为未确认并从队列中移出(因此它们不会传递到其他客户端)。
  • 客户端ack 1消息。
  • 代理未确认-1条消息(删除该消息),并向客户端再发送1条消息(队列中的+1条未确认,-1条,而客户端已取消确认3条消息)。
  • 客户端确认其余3条消息+新传递的一条消息。
  • 代理已取消确认-4条消息,并再次发送4条消息,+4条未确认,-4条来自队列。
  • 客户端ack 1消息失败。
  • Broker将-1 un acked,然后将其余unacked移到queue back,so-3 un aked和+3 queue,这样它们可能会再次传递到这个或其他客户机。

带有大消息的预取:

条件:

  • 队列:1条消息x 5Kb,N条消息x 1kb
  • 预取:prefetch-size=5kb, prefetch-count=2
  • 自动确认:off

工作流程:

  • 代理向客户端发送1条消息(受prefetch-size=5kb限制),并且该消息标记为未生成。
  • 客户端ack 1消息。
  • Broker有-1条消息未确认,再次发送2条消息(受prefetch-count=2限制,请注意,只有第一条消息是5kb,其余消息是1kb),这些消息标记为未确认。
  • 客户端ack 1消息失败。
  • 代理将确认的消息从消息队列中移出,其余未确认的消息将再次移动到它们所属的队列中,以便可以再次将它们传递到此客户端或其他客户端。

自动确认:

条件:

  • 队列:N条消息x 1kb
  • 预取:prefetch-size=5kb, prefetch-count=10
  • 自动确认:on

工作流程:

  • prefetch-sizeprefetch-count设置为true(即在RabbitMQ和AMQP文档中如何调用auto ack功能)时,忽略了这两个选项,但消息将逐个发送到客户端,并在成功发送后从队列中删除。

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

另外,查看^{}^{}官方文档,并对这些选项进行一些尝试。

p.S.:autoack基本上是no-ackAMQP标志设置为true

相关问题 更多 >