死信交换 RabbitMQ 丢弃消息

Posted

技术标签:

【中文标题】死信交换 RabbitMQ 丢弃消息【英文标题】:Dead letter exchange RabbitMQ dropping messages 【发布时间】:2012-11-17 10:02:18 【问题描述】:

我正在尝试在 RabbitMQ 中实现一个 dlx 队列。 场景很简单 我有 2 个队列: 1) 活着 2) dead (x-dead-letter-exchange: "immediate", x-message-ttl: 5000)

以及绑定到 1) 活着的“立即”交换

我试图运行这个例子: http://blog.james-carr.org/2012/03/30/rabbitmq-sending-a-message-to-be-consumed-later/ 但似乎消息在 ttl 过期后被丢弃并且它们不会在交换器上发布,所以我的活动队列总是空的。

我还尝试在管理控制台中手动创建队列,我得到了相同的行为。

我使用 Ubuntu/rabbitmq 3.0.0 以及 Mac OS X 和 rabbitmq 2.8.7 对其进行了测试

我错过了什么吗?

【问题讨论】:

您希望从“活动”队列中过期的消息进入“死”队列吗? 不,实际上是相反的,我希望过期消息从死队列进入活动队列。 他们如何进入死队列? 如果您看一下示例,它们会像普通消息一样发布。我还尝试通过管理控制台直接在死队列上发布消息。在我的实现中,我不使用 expires。 【参考方案1】:

当消息在 RabbitMQ 中“消失”时,问题通常归结为绑定。因此,为了让您的示例正常工作,我执行了以下操作:

    创建了 2 个队列,活的,死的(使用 TTL 和 DLX)

    创建了一个名为 immediate 的 DIRECT 类型的交换

    使用路由键“dead”在交换“立即”和“活动”队列之间创建绑定 - 原因是,消息进入死队列的路由键(如果使用默认exchange is 'dead' 这需要在死信交换的绑定中匹配)。

这里的重要部分是 immediate 交换和 alive 队列之间的绑定。

为了测试我将消息发布到死队列中,我可以看到它短暂出现在死队列中,然后出现在活动队列中。

【讨论】:

我做了一个秒杀并击中了几个showstoppers: 1. 消息只有 DLQ:en 在 Q 的顶部(rabbitmq.com/ttl.html - 警告部分)这意味着如果我首先设置 msg 1 4 小时后过期,msg2 1 小时后过期 msg2 只会在 msg1 过期后过期。 2. 消息的 TTL 由 Rabbit 保存,因此假设您使用 10 秒的短超时。如果消费者在消息过期后 10 秒内无法消费该消息(由于积压),则该消息将被丢弃并丢失 以上已使用 Rabbit 3.0.1 进行了验证。你们有什么解决方法吗? @AndreasÖhlund,如果可能,尝试使用“每个队列 TTL”而不是“每个消息 TTL”进行设计。

以上是关于死信交换 RabbitMQ 丢弃消息的主要内容,如果未能解决你的问题,请参考以下文章

Rabbitmq消费失败死信队列

RabbitMQ 利用消息超时和死信交换机实现定时任务

RabbitMQ死信交换永远不会得到消息

使用RabbitMQ处理死信队列

RabbitMQ死信队列

在 RabbitMQ 中需要单独的死信交换吗?