在 ttl 之后,死信消息没有重新排队到原始队列
Posted
技术标签:
【中文标题】在 ttl 之后,死信消息没有重新排队到原始队列【英文标题】:Dead-letterred messages not getting requeue to original queue after ttl 【发布时间】:2016-07-29 23:10:08 【问题描述】:我计划通过遵循这两个链接link1link2 来延迟队列中消息的处理。因此,正如链接中所建议的那样。我已经用 x-dead-letter-exchange
和 x-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-exchange
和x-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 之后,死信消息没有重新排队到原始队列的主要内容,如果未能解决你的问题,请参考以下文章