RabbitMQ使用立即和强制位

时间:2011-06-17 13:01:46

标签: rabbitmq amqp

我已经使用RabbitMQ服务器并在立即字段设置为 true 时发布消息,我尝试发送50,000条消息并使用 rabbitmqctl list_queues ,我看到队列中的消息数量。然后我将立即标志更改为 false 并再次尝试发送50,000条消息,然后使用 rabbitmqctl list_queues 我看到总共100,000条消息在队列中。 (直到现在没有消费者存在)

之后我开始使用消费者并且它消耗了所有100,000条消息。任何人都可以帮助我理解立即位字段和这种行为。另外,我无法理解强制位字段的概念。

提前感谢。

Gurpreet Singh。

2 个答案:

答案 0 :(得分:110)

immediatemandatory字段是AMQP规范的一部分,RabbitMQ常见问题解答中也包含这些字段,以阐明其实施者如何解释其含义:

Mandatory

  

此标志告诉服务器如何操作   如果无法路由消息,则会做出反应   一个队列。具体来说,如果强制要求   设置和运行绑定后   然后将消息放在零队列上   邮件将返回给发件人   (带有basic.return)。如果是强制性   没有设置相同   服务器会的情况   默默地放下信息。

或者用我的话来说,“将此消息放在至少一个队列中。如果你不能,请将它发回给我。”

Immediate

  

对于立即发布的消息   如果匹配的队列已准备好,请设置   消费者然后其中一个将拥有   消息路由到它。如果幸运的话   消费者在购买前崩溃   收到邮件将被重新排队   和/或交付给其他消费者   那个队列(如果没有崩溃的话)   消息是ack'ed,一切都完成了   按照正常情况)。但是,如果是   匹配队列已准备就绪   消费者的信息不会   排队等待随后的重新开始   从那个队列。只有全部的   匹配的队列没有准备好   消费者返回消息   发件人(通过basic.return)。

或者用我的话来说,“如果至少有一个消费者连接到我的队列,可以立即接收消息,立即将消息传递给他们。如果没有连接消费者那么就没有指出我的消息后来消耗了,他们永远不会看到它。他们打盹,他们输了。“

答案 1 :(得分:5)

http://www.rabbitmq.com/blog/2012/11/19/breaking-things-with-rabbitmq-3-0/

  

删除“立即”标记

     

发生了什么变化?我们删除了对   AMQP的basic.publish上很少使用的“立即”标记。

     

您为什么这么做?支持“即时”的内容很多   的代码库更加复杂,尤其是在镜像队列周围。它   也阻碍了我们能够提供大量   镜像队列中的性能改进。

     

我需要做什么?如果您只想发布消息   如果不立即食用它们将被丢弃,您可以   发布到TTL为0的队列。

     

如果您还需要您的发布商能够确定   发生这种情况,您还可以使用DLX功能将此类消息路由到   另一个队列,发布者可以从中使用它们。

只需在此处复制此公告即可快速参考。