RabbitMQ 使用立即位和强制位

Posted

技术标签:

【中文标题】RabbitMQ 使用立即位和强制位【英文标题】:RabbitMQ use of immediate and mandatory bits 【发布时间】:2011-09-17 04:26:45 【问题描述】:

我正在使用 RabbitMQ 服务器。

为了发布消息,我将 immediate 字段设置为 true 并尝试发送 50,000 条消息。使用rabbitmqctl list_queues,我看到队列中的消息数为

然后,我将 immediate 标志更改为 false 并再次尝试发送 50,000 条消息。使用rabbitmqctl list_queues,我看到总共有 100,000 条消息在队列中(到目前为止,没有消费者在场)。

之后,我启动了一个消费者,它消费了所有 100,000 条消息。

任何人都可以帮助我理解 立即 位字段和这种行为吗?另外,我无法理解 mandatory 位字段的概念。

【问题讨论】:

【参考方案1】:

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

Mandatory

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

或者用我的话来说,“把这条消息放在至少一个队列上。如果你不能,把它发回给我。”

Immediate

对于立即发布的消息 设置,如果匹配的队列已经准备好 那么其中一个消费者将拥有 路由到它的消息。如果幸运的话 消费者在确认之前崩溃 收到消息将被重新排队 和/或交付给其他消费者 该队列(如果没有崩溃 消息已确认,一切都已完成 正常)。然而,如果一个 匹配队列零就绪 消费者的消息不会 排队等待随后的重新交付 从那个队列。只有当所有的 匹配队列没有准备好 消息返回的消费者 发件人(通过 basic.return)。

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

【讨论】:

如果幸运消费者在确认收据之前崩溃并且队列中没有其他消费者会发生什么?消息是否仍然只是在队列中?还是退货? 我没有测试它,但我可以猜测崩溃的消费者是另一个故事,并且与重新排队或死信有关的行为。 抱歉在将近 5 年后添加评论...在我看来 immediate 标志没有通过 RabbitMQ 的 API 公开?至少不在 .Net API 中。我发现在库中可以设置immediate 标志的唯一方法是通过库中从未使用过的内部BasicPublish 类的构造函数。 immediate 在某种程度上是否被弃用或不鼓励? 啊,找到了我的问题的答案:immediate was removed in Rabbit v3.0,因为它很少使用,代码库复杂并且有替代方案。 喜欢“或者用我的话来说”。我希望所有的技术规格都是这样 :)【参考方案2】:

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

删除“立即”标志

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

你到底为什么要这么做?支持“立即”制作了很多部分 的代码库更复杂,尤其是在镜像队列周围。它 也阻碍了我们能够提供大量 镜像队列的性能改进。

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

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

刚刚复制了这里的公告以供快速参考。

【讨论】:

以上是关于RabbitMQ 使用立即位和强制位的主要内容,如果未能解决你的问题,请参考以下文章

关于float在32位和64位的转换?

JAVA线程中断

可以通过参数“-d32”强制 64 位 JVM 使用 32 位模式吗?

强制 gcc 在 64 位平台上编译 32 位程序

强制 64 位 jvm 到 32 位 jvm?

Stripe 客户门户网站在更新付款方式后立即对“逾期”发票强制重试收费