首页 文章

RabbitMQ使用立即和强制位

提问于
浏览
43

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

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

提前感谢 .

Gurpreet Singh .

2 回答

  • 5

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

    Mandatory

    此标志告诉服务器如果无法将消息路由到队列,如何做出反应 . 具体来说,如果设置了必需,并且在运行绑定后,消息被放置在零队列上,则消息将返回给发送方(使用basic.return) . 如果在相同的情况下没有设置强制,服务器将默默地丢弃该消息 .

    或者用我的话说,"Put this message on at least one queue. If you can't, send it back to me."

    Immediate

    对于使用立即设置发布的消息,如果匹配的队列具有就绪消费者,则其中一个消息将路由到该消息 . 如果幸运消费者在收到消息之前崩溃,则该消息将被重新排队和/或传递给该队列上的其他消费者(如果没有崩溃,则消息被确认并且全部按照正常情况完成) . 但是,如果匹配的队列没有就绪消费者,则该消息将不会排队以便从该队列进行后续重新传递 . 仅当所有匹配队列都没有就绪消费者时才将消息返回给发件人(通过basic.return) .

    或者用我的话来说,"If there is at least one consumer connected to my queue that can take delivery of a message right this moment, deliver this message to them immediately. If there are no consumers connected then there's no point in having my message consumed later and they'll never see it. They snooze, they lose."

  • 109

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

    删除“立即”标志改变了什么?我们删除了对AMQP basic.publish上很少使用的“立即”标志的支持 . 为什么你这样做?对“立即”的支持使得代码库的许多部分变得更加复杂,尤其是在镜像队列周围 . 它还阻碍了我们能够在镜像队列中提供显着的性能改进 . 我需要做什么?如果您只是希望能够发布如果不立即使用它们将被删除的消息,您可以发布到TTL为0的队列 . 如果您还需要您的发布者能够确定发生了这种情况,那么您也可以使用DLX功能将此类消息路由到另一个队列,发布者可以从中消耗它们 .

    刚刚复制了这里的公告,以便快速参考 .

相关问题