死信交换机是指RabbitMQ丢弃消息的情况。

8
我正在尝试在RabbitMQ中实现dlx队列。 场景非常简单 我有两个队列: 1)alive 2)dead(x-dead-letter-exchange:“immediate”,x-message-ttl:5000)
还有一个交换机“immediate”与1)alive绑定
我尝试运行这个例子: http://blog.james-carr.org/2012/03/30/rabbitmq-sending-a-message-to-be-consumed-later/ 但似乎消息在ttl过期后被丢弃,并且它们没有发布到交换机,因此我的alive队列始终为空。
我还尝试在管理控制台中手动创建队列,但得到了相同的行为。
我使用Ubuntu / rabbitmq 3.0.0和Mac OS X和rabbitmq 2.8.7进行了测试
我错过了什么吗?

您是否希望从“alive”队列中过期的消息进入“dead”队列? - kzhen
不,实际上相反,我希望来自死信队列的过期消息进入活动队列。 - Fabrizio Sestito
他们如何进入死亡队列? - kzhen
如果你看一下这个例子,它们像普通消息一样被发布。 我也尝试直接在死信队列上通过管理控制台发布消息。 在我的实现中,我不使用过期时间。 - Fabrizio Sestito
1个回答

8
当RabbitMQ中的消息“消失”时,通常是与绑定有关的问题。因此,要使示例工作,我执行了以下操作:
  1. 创建了两个队列alive和dead(具有TTL和DLX)
  2. 创建了一个类型为DIRECT的exchange,名为immediate
  3. 创建了一个绑定,将交换机“immediate”和队列“alive”绑定,路由键为“dead”——这样做的原因是,如果使用默认交换机将消息发送到死信队列,则进入死信队列的消息的路由键是'dead',需要在死信交换机的绑定中匹配。
重要的部分在于立即交换和alive队列之间的绑定。 为了测试,我发布了一条消息到死信队列,我能看到它短暂地出现在死信队列中,然后出现在活动队列中。

我进行了一次尝试,遇到了几个问题:
  1. 消息只有在队列顶部时才会被标记为DLQ(http://www.rabbitmq.com/ttl.html - 注意事项部分) 这意味着,如果我首先将消息1设置为4小时后过期,将消息2设置为1小时后过期,则只有在消息1过期后,消息2才会过期。
  2. 消息的TTL由Rabbit保存,假设您使用了10秒的短超时时间。如果消费者在消息过期后的10秒内无法消费该消息(由于积压),则该消息将被丢弃并且丢失。
以上内容已经通过Rabbit 3.0.1进行验证。你们看到有什么解决方法吗?
- Andreas Öhlund
2
@AndreasÖhlund,如果可能的话,请尝试使用“每个队列TTL”而不是“每个消息TTL”进行设计。 - Ahmet Akyol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接