根据互联网(我的问题在底部),当在 RabbitMQ 中使用
drop-head
溢出行为时,重要的是要理解这种行为与将消息路由到死信交换(DLX)的机制不同。 drop-head
行为与队列达到最大长度时如何处理情况特别相关。
以下是所发生情况的详细说明:
Drop-Head 行为:当队列配置为
drop-head
溢出行为并且达到最大长度时,队列中最旧的消息(位于队列“头部”的消息)将被丢弃以腾出空间对于新收到的消息。这意味着最旧的消息只是从队列中删除。
死信交换路由:通常情况下,消息会在特定条件下路由到DLX,例如消息拒绝(nack)、消息过期或队列达到最大长度。然而,到 DLX 的路由是一个单独的机制。并非所有从队列中删除消息的操作都会将消息发送到 DLX。在
drop-head
的情况下,消息不是死信,而是被简单地丢弃。
丢弃的消息没有死信:当消息由于
drop-head
溢出行为而被丢弃时,它们不会发送到DLX。他们实际上已经迷失了。这是设计消息处理架构时要考虑的关键点,特别是在丢失消息可能会产生严重后果的系统中。
总而言之,RabbitMQ 中的
drop-head
溢出行为会导致最旧的消息被丢弃并且不会发送到 DLX。这与其他情况(如消息拒绝或过期)形成鲜明对比,在其他情况下,消息可以是死信的并重新路由。根据应用程序的特定需求和对消息丢失的容忍度来配置 RabbitMQ 设置和溢出行为非常重要。
我的问题:
有没有办法配置RMQ,使其在使用“drop-head”或“drop-tail”时不只是让消息消失,而是将它们发送到其他地方?
同样,我很好奇如果“强制”发布选项设置为 true 并且没有队列与路由键匹配,如何自动将消息放入辅助队列/交换器上
谢谢兔子,你太棒了。
我认为没有任何选项可以完全按照您所描述的方式执行操作,但您可以尝试使用
reject-publish-dlx
。使用此功能时,如果队列溢出,最新的消息将被丢弃。
来自文档:
如果overflow设置为reject-publish或reject-publish-dlx,则最多 最近发布的消息将被丢弃。 ...如果一条消息是 路由到多个队列并被至少其中一个队列拒绝, 频道将通过 basic.nack 通知发布者。该消息将 仍然会发布到可以将其排队的所有其他队列。这 拒绝发布和拒绝发布 dlx 之间的区别在于 reject-publish-dlx 也会死信拒绝消息。
我认为这里唯一的选择是替代交换。如果在队列上配置了 AE,并且消息在没有任何匹配路由键的情况下发布到队列,它将被路由到您的备用交换机。
来自文档:
每当与已配置 AE 的交换无法将消息路由到 任何队列,它都会将消息发布到指定的 AE。如果 如果 AE 不存在,则会记录警告。如果 AE 无法路由 一条消息,如果它有一个消息,它又将该消息发布到它的 AE 配置。此过程将持续进行,直到消息出现 成功路由,到达 AE 链的末端,或者 AE 遇到已经尝试路由消息的情况。