我上个月成功使用RabbitMQ
。使用RabbitMQ的BasicConsume功能从队列中读取消息。发布到队列的消息立即被相应的消费者使用。
现在我创建了一个新的队列DelayedMsg,发布到这个队列的消息必须在延迟5分钟后读取。我该怎么办?
答案 0 :(得分:2)
在发布者/发件人向主队列发布消息时,向邮件添加当前时间戳值。比如说,' published_on' => 1476424186。
在消费者方面,首先检查当前时间戳和published_on的时差。
如果发现差异小于5分钟,则将您的消息发送到另一个队列(DLX队列)并设置到期时间。(使用'到期' amqp消息的属性)
此到期值应为(当前时间戳 - published_on),并且应该以毫秒为单位。
消息将在精确的5分钟内在DLX队列中过期。
确保' x-dead-letter-exchange'应该是您的主队列交换,并与dlx队列绑定,以便当消息过期时,它将自动排队回主队列。有关详细信息,请参阅Dead Letter Exchange。
因此,消费者现在在5分钟后收到消息,正常处理,因为它的当前时间戳和published_on差异将大于5分钟。
答案 1 :(得分:0)
尝试避免使用DLX再实现延迟消息。在使用“RabbitMQ延迟消息插件”之前,它更像是一种解决方法。
由于现在我们有这个插件,我们应该尝试使用它: https://www.rabbitmq.com/blog/2015/04/16/scheduling-messages-with-rabbitmq/
答案 2 :(得分:0)
创建2个队列
1是工作队列
2是延迟队列
并设置延迟队列属性x-dead-letter - >工作队列名称,ttl - > 5min
发送消息到延迟队列,不需要消费者它,5min后,这个消息发送到交易信(工作队列),所以你只需消费工作队列并处理它