RabbitMQ立即位和强制位的使用
我正在使用RabbitMQ服务器 对于发布消息,我将immediate字段设置为true,并尝试发送50000条消息。使用RabbitMQ立即位和强制位的使用,rabbitmq,amqp,Rabbitmq,Amqp,我正在使用RabbitMQ服务器 对于发布消息,我将immediate字段设置为true,并尝试发送50000条消息。使用rabbitmqctl list\u队列,我看到队列中的消息数为零 然后,我将立即标记改为false,并再次尝试发送50000条消息。使用rabbitmqctl list_queues,我看到队列中总共有100000条消息(到目前为止,没有消费者) 在那之后,我创建了一个消费者,它消费了所有100000条信息 有谁能帮助我理解立即位字段和这种行为吗?此外,我无法理解强制位字段
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
在某种程度上是不赞成还是不赞成?啊,找到了我问题的答案:因为它很少被使用,使代码库复杂化,并且有一个替代方案。喜欢“或用我的话来说”。我希望所有的技术规格都是这样:)