在 ttl 之后,死信消息没有重新排队到原始队列

Posted

技术标签:

【中文标题】在 ttl 之后,死信消息没有重新排队到原始队列【英文标题】:Dead-letterred messages not getting requeue to original queue after ttl 【发布时间】:2016-07-29 23:10:08 【问题描述】:

我计划通过遵循这两个链接link1link2 来延迟队列中消息的处理。因此,正如链接中所建议的那样。我已经用 x-dead-letter-exchangex-dead-letter-routing-key 参数声明了原始队列。当消息无法被消费者处理或发生ttl或队列长度超过时,它将消息发布到所谓的dead-letter-queue。现在在dead-letter-queue 中设置了类似的参数以及ttl 参数。假设在ttl 超出之后将消息重新发布到原始队列。但问题是它正在丢弃所有消息。

此外,这里有一个问题。如果我将失败的消息从原始队列显式发布到死信队列。然后在 ttl 之后将消息重新发布到原始队列。为什么会这样,我如何使它工作。这样死信队列会将消息重新发布到原始队列而不是丢弃。我正在使用RabbitMQ 3.0.0

仅供参考,我已经创建了 direct 类型的交换以及路由密钥

【问题讨论】:

【参考方案1】:

如果队列设置了 TTL,则意味着该队列中的消息将在 TTL 过期后发送到与该队列关联的死信交换 (DLX)。如果队列没有分配 DLX,则消息进入比特桶。

如果您想将消息发送回队列中,然后重新处理它们,那么您需要进行我在这篇文章中描述的设置。

Dead-lettering dead-lettered messages in RabbitMQ

希望对你有帮助。

【讨论】:

而不是按照你的建议去做。我们还可以将失败消息从原始队列显式发布到死信队列,而不是借助x-dead-letter-exchangex-dead-letter-routing-key。然后,死信队列也会在 ttl 之后将消息重新发布到它的原始队列。因此,我无法理解显式发布消息和通过内置功能发布消息的区别。 您描述的方式只有在您有一个队列时才有效。在我的链接中,该方法适用于将 N 个死信队列放入单个重试队列中。 无论如何,但为什么在显式发布消息和通过内置功能发布消息方面存在差异。任何想法 您能否告诉您如何维护失败消息的计数。您是否使用了一些内置功能,或者您维护了自定义的计数变量,并且每次重试时都会增加。 @naresh,这是我增加的客户变量。这是我的实用服务:gist.github.com/jayhilden/2078872a53c7df0fe45d661861ed2d45【参考方案2】:

假设您的原始交换是 x.notification,并通过路由队列 A 绑定到队列 q.A。而您的死信交换名称是 dlx.notification。现在在队列 q.A 中设置 ttl 您要等待的时间间隔,并将 dead-lleter-exchange 设置为 dlx.notification。现在创建另一个队列 dlq.A 以使用路由键“A”将过期消息从 dlx.notification 路由到 dlq.A。我认为这就是实现目标所需要做的一切。

【讨论】:

以上是关于在 ttl 之后,死信消息没有重新排队到原始队列的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ ACK、NACK、Type、TTL、死信

RabbitMQ 死信队列DLX

RabbitMQ项目使用之死信队列

MQ-死信队列实现消息延迟

RabbitMQ项目使用之死信队列

rabbitmq~消息失败后重试达到 TTL放到死信队列(事务型消息补偿机制)