【问题标题】:Dead-letterred messages not getting requeue to original queue after ttl在 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 类型的交换以及路由密钥

【问题讨论】:

    标签: rabbitmq amqp rabbitmq-exchange rabbitmqctl


    【解决方案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。我认为这就是实现目标所需要做的一切。

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 1970-01-01
      • 2020-02-14
      • 2022-01-27
      • 1970-01-01
      • 2013-10-14
      • 2019-09-27
      • 2015-06-14
      • 2011-06-02
      相关资源
      最近更新 更多