我已经使用RabbitMQ服务器并在立即字段设置为 true 时发布消息,我尝试发送50,000条消息并使用 rabbitmqctl list_queues ,我看到队列中的消息数量零。然后我将立即标志更改为 false 并再次尝试发送50,000条消息,然后使用 rabbitmqctl list_queues 我看到总共100,000条消息在队列中。 (直到现在没有消费者存在)
之后我开始使用消费者并且它消耗了所有100,000条消息。任何人都可以帮助我理解立即位字段和这种行为。另外,我无法理解强制位字段的概念。
提前感谢。
Gurpreet Singh。
答案 0 :(得分:110)
immediate
和mandatory
字段是AMQP规范的一部分,RabbitMQ常见问题解答中也包含这些字段,以阐明其实施者如何解释其含义:
此标志告诉服务器如何操作 如果无法路由消息,则会做出反应 一个队列。具体来说,如果强制要求 设置和运行绑定后 然后将消息放在零队列上 邮件将返回给发件人 (带有basic.return)。如果是强制性 没有设置相同 服务器会的情况 默默地放下信息。
或者用我的话来说,“将此消息放在至少一个队列中。如果你不能,请将它发回给我。”
对于立即发布的消息 如果匹配的队列已准备好,请设置 消费者然后其中一个将拥有 消息路由到它。如果幸运的话 消费者在购买前崩溃 收到邮件将被重新排队 和/或交付给其他消费者 那个队列(如果没有崩溃的话) 消息是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功能将此类消息路由到 另一个队列,发布者可以从中使用它们。
只需在此处复制此公告即可快速参考。