繁体   English   中英

当消费者关闭时,消息不会路由到死信队列

[英]Message is not routing to dead letter queue when consumer is down

我有一个服务 A 正在向队列(QA)发布消息。 我有一个死信队列(DLQ)与 DLRK 绑定到 DLX。 队列 A 绑定到具有路由密钥 (RA) 的交换 (EA)。 我还在 QA 上设置了 x-letter-exchange(DLX) 和 x-dead-letter-routing-key(DLRK),此队列上的 ttl-per-message 设置为 60 秒 DLQ 也设置为 x-letter- exchange(EA) 和 x-dead-letter-routing-key(DLRK),此队列上的 ttl-per-message 为 60 秒。

通过上述配置,我尝试在 ttl 过期后将消息从 QA 路由到 DLQ,反之亦然。 在作为另一个服务的消费者端,我抛出 AMQPRejectAndDontRequeueException 并将 defaultRequeueRejected 设置为 fals。

当消费者启动并抛出
例外。 但我试图将我的队列大小限制为 1,然后向 QA 发布 3 条消息并关闭使用者。 我看到所有三个消息都放在 QA 和 DLQ 中,最终所有消息都被丢弃了。 但是,如果我不将队列限制设置为 1 或启动消费者,则一切正常。

我还将 x-overflow 设置为拒绝发布,当出现溢出时,我会向发布者发出警告,然后我有一个调度程序将其再次发布给 QA。

注意:两个交换都是直接的,我使用路由键将其绑定到各自的队列。

请让我知道如果我在这里遗漏了什么,让我知道需要分享我的配置

深入挖掘后,我想我终于从 pinepain 的RabbitMQ answer 链接Dead-lettering dead- lettered messages 中找到了答案

有可能形成死信队列的循环。 例如,当队列将死信消息发送到默认交换而未指定死信路由键时,就会发生这种情况。 如果整个周期是由于消息到期,则此类周期中的消息(即到达同一队列两次的消息)将被丢弃。

所以我认为要解决这个问题,我需要创建另一个消费者来从死信队列中消费并将其从消费者发布回原始队列,而不是直接从死信队列中 ttl。 如果我的理解正确,请纠正我。

我可能来得太晚了,但我想我可以帮助你。

故事:您想要一个重试队列,在一段时间后将死消息发送到主队列,并在主队列中检索和重新排队。

解决方案:

  1. 声明您的主队列并将其绑定到交换。 我们称它们为main_queuemain_exchange并将此功能添加到 main_queue: x-dead-letter-exchange: retry_exchange
  2. 创建您的重试队列并将其绑定到另一个交换机。 我们将这些retry_queueretry_exchange并将这些功能添加到重试队列中: x-dead-letter-exchange: main_exchangex-message-ttl: 10000

有了这种结合,从死了的消息main_queue将被发送到retry_queue 10秒后,他们将再次发送到main_queue这将他们无限期地持续下去,直到消费者宣称他们已经死了。

注意:此方法仅在您将消息发布到交换而不是直接在队列中时才有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM