RabbitMQ立即位和强制位的使用

RabbitMQ立即位和强制位的使用,rabbitmq,amqp,Rabbitmq,Amqp,我正在使用RabbitMQ服务器 对于发布消息,我将immediate字段设置为true,并尝试发送50000条消息。使用rabbitmqctl list\u队列,我看到队列中的消息数为零 然后,我将立即标记改为false,并再次尝试发送50000条消息。使用rabbitmqctl list_queues,我看到队列中总共有100000条消息(到目前为止,没有消费者) 在那之后,我创建了一个消费者,它消费了所有100000条信息 有谁能帮助我理解立即位字段和这种行为吗?此外,我无法理解强制位字段

我正在使用RabbitMQ服务器

对于发布消息,我将immediate字段设置为true,并尝试发送50000条消息。使用
rabbitmqctl list\u队列
,我看到队列中的消息数为零

然后,我将立即标记改为false,并再次尝试发送50000条消息。使用
rabbitmqctl list_queues
,我看到队列中总共有100000条消息(到目前为止,没有消费者)

在那之后,我创建了一个消费者,它消费了所有100000条信息


有谁能帮助我理解立即位字段和这种行为吗?此外,我无法理解强制位字段的概念。

立即和
强制
字段是AMQP规范的一部分,RabbitMQ FAQ中也包含了这些字段,以澄清其实现者如何解释其含义:

此标志告诉服务器如何 如果消息无法路由到,请做出反应 排队。具体来说,如果是强制性的 在运行绑定后设置和 消息当时被放置在零队列上 邮件将返回给发件人 (带有基本的.return)。如果是强制性的 没有被设定在同一个条件下 服务器可能会出现的情况 悄悄地放下留言

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

对于使用即时消息发布的消息 如果匹配队列已就绪,则设置 那么其中一个消费者就有了 消息被路由到它。如果幸运的话 消费者在确认前崩溃 收到消息后,将重新发出消息 和/或在 该队列(如果没有崩溃) 消息已确认,一切都已完成 按照正常情况)。但是,如果 匹配队列的就绪状态为零 消费者:这条信息不会被忽略 排队等待日后的重新交付 从那个队列。除非所有的 匹配的队列没有就绪状态 消费者确认消息已返回 发送给发件人(通过basic.return)

或者用我的话说,“如果至少有一个消费者连接到我的队列,此时可以接收邮件,请立即将此邮件发送给他们。如果没有消费者连接,则以后再使用我的邮件是没有意义的,他们将永远看不到。他们打盹,他们就会丢失。”

删除“立即”标志

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

你到底为什么要这样做?对“立即”的支持有很多方面 代码库的定义更加复杂,尤其是在镜像队列周围。信息技术 也阻碍了我们提供实质性服务 镜像队列中的性能改进

如果您只想发布消息,我需要做什么? 如果不立即消费,则会删除,您可以 发布到TTL为0的队列

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


刚刚复制了此处的公告以供快速参考。

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