C# RabbitMQ中的基本消耗调度

C# RabbitMQ中的基本消耗调度,c#,rabbitmq,C#,Rabbitmq,我正在成功使用上个月的RabbitMQ。使用RabbitMQ的BasicConsume功能从队列中读取消息。发布到队列的消息立即被相应的使用者使用。 现在,我创建了一个新的队列DelayedMsg,发布到此队列的消息必须在延迟5分钟后才能读取。我该怎么办?将消息从发布者/发送者发布到主队列时,向消息添加当前时间戳值。例如,“发布时间”=>1476424186 在用户端,首先检查当前时间戳和发布的时间戳的时差 如果发现差异小于5分钟,则在另一个队列(DLX队列)中发送消息,并设置过期时间。(使用a

我正在成功使用上个月的
RabbitMQ
。使用RabbitMQ的BasicConsume功能从队列中读取消息。发布到队列的消息立即被相应的使用者使用。
现在,我创建了一个新的队列DelayedMsg,发布到此队列的消息必须在延迟5分钟后才能读取。我该怎么办?

将消息从发布者/发送者发布到主队列时,向消息添加当前时间戳值。例如,“发布时间”=>1476424186

在用户端,首先检查当前时间戳和发布的时间戳的时差

如果发现差异小于5分钟,则在另一个队列(DLX队列)中发送消息,并设置过期时间。(使用amqp消息的“过期”属性)

此过期值应为(当前时间戳-发布时间),且以毫秒为单位

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

确保“x-dead-letter-exchange”应该是您的主队列交换,并且与dlx队列绑定,以便在消息过期时,它将自动排队返回主队列。有关更多详细信息,请参阅


因此,消费者现在在5分钟后收到消息,并正常处理,因为其当前时间戳和发布时间差将大于5分钟。

尝试避免使用DLX实现延迟消息。它更像是在使用“RabbitMQ延迟消息插件”之前的一种变通方法

既然我们现在有了这个插件,我们应该尝试使用它: 创建两个队列。
1是工作队列
2是延迟队列
并设置延迟队列属性x死信-->工作队列名称,ttl-->5分钟

将消息发送到延迟队列,不需要消费它,5分钟后,此消息发送到处理信(工作队列),因此,您只需使用工作队列并对其进行处理

此插件显示了一些问题,请参见:@Bhimaro Gadge在DLX队列中超时5分钟后,消息是否将再次重新排队到主队列或从DLX队列中使用?过期的消息将重新排队到主队列中,然后从那里,它将被消费者接收/消费。在我的例子中,需求是复杂的。并不是每一条信息都必须被延迟。我必须检查一些因素。所以我把DLX重新排队逻辑放在消费者端。如果您的要求真的像您提到的那样非常简单,那么我建议使用其他选项,即直接将消息发送到DLX队列,在消息上设置5分钟过期时间,或在队列上设置5分钟TTL()。已将此DLX队列与主exchange绑定。5分钟后,过期的消息在主队列中重新排队,然后消费者将使用它。