使用'x-max-length'和'x-overflow'时,如何发送到dead-letter-exchange

问题描述 投票:0回答:1

根据互联网(我的问题在底部),当在 RabbitMQ 中使用

drop-head
溢出行为时,重要的是要理解这种行为与将消息路由到死信交换(DLX)的机制不同。
drop-head
行为与队列达到最大长度时如何处理情况特别相关。

以下是所发生情况的详细说明:

  1. Drop-Head 行为:当队列配置为

    drop-head
    溢出行为并且达到最大长度时,队列中最旧的消息(位于队列“头部”的消息)将被丢弃以腾出空间对于新收到的消息。这意味着最旧的消息只是从队列中删除。

  2. 死信交换路由:通常情况下,消息会在特定条件下路由到DLX,例如消息拒绝(nack)、消息过期或队列达到最大长度。然而,到 DLX 的路由是一个单独的机制。并非所有从队列中删除消息的操作都会将消息发送到 DLX。在

    drop-head
    的情况下,消息不是死信,而是被简单地丢弃。

  3. 丢弃的消息没有死信:当消息由于

    drop-head
    溢出行为而被丢弃时,它们不会发送到DLX。他们实际上已经迷失了。这是设计消息处理架构时要考虑的关键点,特别是在丢失消息可能会产生严重后果的系统中。

总而言之,RabbitMQ 中的

drop-head
溢出行为会导致最旧的消息被丢弃并且不会发送到 DLX。这与其他情况(如消息拒绝或过期)形成鲜明对比,在其他情况下,消息可以是死信的并重新路由。根据应用程序的特定需求和对消息丢失的容忍度来配置 RabbitMQ 设置和溢出行为非常重要。


我的问题:

  1. 有没有办法配置RMQ,使其在使用“drop-head”或“drop-tail”时不只是让消息消失,而是将它们发送到其他地方?

  2. 同样,我很好奇如果“强制”发布选项设置为 true 并且没有队列与路由键匹配,如何自动将消息放入辅助队列/交换器上

谢谢兔子,你太棒了。

rabbitmq message-queue rabbitmq-exchange dead-letter
1个回答
0
投票

1.溢出到DLX

我认为没有任何选项可以完全按照您所描述的方式执行操作,但您可以尝试使用

reject-publish-dlx
。使用此功能时,如果队列溢出,最新的消息将被丢弃。

来自文档

如果overflow设置为reject-publish或reject-publish-dlx,则最多 最近发布的消息将被丢弃。 ...如果一条消息是 路由到多个队列并被至少其中一个队列拒绝, 频道将通过 basic.nack 通知发布者。该消息将 仍然会发布到可以将其排队的所有其他队列。这 拒绝发布和拒绝发布 dlx 之间的区别在于 reject-publish-dlx 也会死信拒绝消息。

2.没有匹配键时的路由

我认为这里唯一的选择是替代交换。如果在队列上配置了 AE,并且消息在没有任何匹配路由键的情况下发布到队列,它将被路由到您的备用交换机。

来自文档

每当与已配置 AE 的交换无法将消息路由到 任何队列,它都会将消息发布到指定的 AE。如果 如果 AE 不存在,则会记录警告。如果 AE 无法路由 一条消息,如果它有一个消息,它又将该消息发布到它的 AE 配置。此过程将持续进行,直到消息出现 成功路由,到达 AE 链的末端,或者 AE 遇到已经尝试路由消息的情况。

文档中提供了通过策略或通过客户端提供的参数配置 AE 的示例。

© www.soinside.com 2019 - 2024. All rights reserved.