2012-11-29 65 views
7

我想在RabbitMQ中实现一个dlx队列。 的情况是很容易 我有2个队列: 1)活着 2)死亡(X-死信交换: “立即”,X-消息-TTL:5000)死信交换RabbitMQ丢弃消息

和交流“立即“绑定到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

我缺少的东西进行测试呢?

+0

您是否希望从“活动”队列过期的邮件进入“死”队列? – kzhen

+0

没有其实它的相反,我希望从死队列过期的消息到活着的队列。 –

+0

他们如何进入死队? – kzhen

回答

8

当RabbitMQ中的消息'消失'时,问题通常由绑定引起。所以,要想让你的榜样工作,我做了以下内容:

  1. 创建2个队列,活的,死的(与TTL和DLX)

  2. 创建了一个交流称为即时类型的直接的

  3. 在交换“immediate”和队列“alive”之间创建了一个绑定,路由键为“dead” - 原因是因为,消息进入死队列的路由密钥(如果使用默认交换“死”这需要在死信交换中的绑定中匹配)。

重要这儿的一部分是在立即交流和活着队列之间的结合。

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

+0

现在工作!非常感谢! –

+0

我做了一个秒杀,打了几个showstoppers: 1.消息只是DLQ:当在Q的顶端(http://www.rabbitmq.com/ttl.html - 注意部分) 这意味着如果我首先设置msg 1在4小时后过期,msg2在1小时后过期msg2只会在msg1过期后过期。 2.消息的TTL由Rabbit保存,所以可以说你使用10秒的短暂超时。如果消费者在过期10秒后(由于积压)未能消费该消息,则该消息将被丢弃并丢失 以上已经使用Rabbit 3.0.1进行了验证。你们看到任何解决方法吗? –

+2

@AndreasÖhlund,如果可能的话,尝试使用“每队列TTL”设计,而不是“每个消息TTL”。 –

相关问题