RabbitMQ - 如何配置条件DLX?

时间:2016-03-22 14:57:02

标签: c# rabbitmq

我有一个活动队列,它将拥有来自Publisher的所有消息。我的消费者根据消息处理结果读取这些消息和Acks / Nack。

while (true)
{
   var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

   var body = ea.Body;
   var message = Encoding.UTF8.GetString(body);

   var processed = ProcessMessage(message)

   if (processed)                        
      channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
   else
      channel.BasicNack(deliveryTag: ea.DeliveryTag, multiple: false, requeue: true);
}

我的问题是

  • 如果true参数正确无误,是否设置了requeue
  • 或者我们是否需要为Retry创建另一个队列?
  • 让我们说,如果我想在重试10次后将消息移动到DLX?我该怎么做?是C#代码还是可以在队列中定义规则?
  • 如何知道邮件重试10次? RabbitMQ是否提供任何机制,还是需要手动设计消息对象以包含重试计数?

感谢您的投入

2 个答案:

答案 0 :(得分:3)

从版本3.5.2开始,RabbitMQ会自动为包含以下信息的死信消息添加标题:

  • 看到消息的队列
  • 原因是死信
  • 死信的次数
  • 时间戳

查看"Dead-Lettered Messages" section near the end of the DLX documentation了解更多详情。

如果您使用较旧版本的RabbitMQ,那么@ Franklin的解决方案应该可行。

答案 1 :(得分:1)

如果将requeue设置为false,则它将转到分配给Queue的任何DeadLetter Exchange。 True将重新排列该消息。

我为重试尝试所做的是创建一个保持交换和队列。如果要重试消息,请将正Ack返回到队列,向消息添加RetryAttepmts标头,然后使用超时值将其发布到HoldQueue Exchange。将Hold Queue Dead Letter Exchange设置为将消息发送到原始队列的交换机。然后检查标题并确认重试尝试是否太大

这是一个很好的网站,详细介绍了这个过程 http://yuserinterface.com/dev/2013/01/08/how-to-schedule-delay-messages-with-rabbitmq-using-a-dead-letter-exchange/