2016-10-14 30 views
3

我使用RabbitMQ使用发布到队列立即通过相应的消费者消费RabbitMQ.The消息BasicConsume特点上个月successfully.Messages从队列中读取。 现在我创建了一个新的队列DelayedMsg,发布到这个队列的消息只有在延迟5分钟后才能被读取。我该怎么办?调度基本消耗RabbitMQ的

回答

2

当前时间戳值添加到所述消息而发布的消息以从出版商/发送方的主队列。说例如,“published_on” => 1476424186.

在消费者侧,首先检查当前的时间戳和published_on的时间差。

如果发现是少于5分钟的差,然后用设定到期时间发送邮件在另一队列(一个DLX队列)。(AMQP消息的使用“过期”属性)

该期满值应be(当前时间戳 - 已发布),它应该以毫秒为单位。

消息将在精确5分钟的DLX队列中过期。

确保'x-dead-letter-exchange'应该是您的主要队列交换并且与dlx队列有界,这样当消息到期时,它将自动排队回主队列。有关更多详细信息,请参阅Dead Letter Exchange

因此,消费者现在得到的消息5分钟后回来,过程中它正常的,因为其当前的时间戳和published_on差将超过5分钟以上。

+0

@Bhimaro Gadge后,你只是消费者的工作队列和处理它在DLX的5分钟超时队列消息是否会再次重新排队到主从DLX队列中排队还是消耗? –

+1

已过期的消息将被重新排入主队列,并从此处消费者接收/消费。 –

+1

就我而言,这个要求很复杂。并非每个消息都必须延迟。有一些因素需要检查。所以我在消费者端放置了DLX requeue逻辑。如果你的要求真的很简单,那么我建议与其他选项直接发送消息到DLX队列设置5分钟过期消息或设置队列5分钟TTL(https://www.rabbitmq.com /ttl.html)。用主交换机绑定这个DLX队列。过期的消息然后在5分钟后在主队列中重新排队。然后消费者会消费它。 –

0

尝试避免使用DLX来实现延迟的消息了。它更像是在拥有“RabbitMQ延迟消息插件”之前的解决方法。

因为现在我们有了这个插件,我们应该尽量用它代替: https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/

+1

这个插件显示了一些问题见:[link](https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/issues) –

0

创建2个队列。
1是工作队列
2是延迟队列
并设置延迟队列楼盘X-死信 - >工作队列名,TTL - > 5分钟
信息发送到延迟队列,不需要消费者吧,毕竟5分钟,该发送处理字母(工作队列)的消息,所以