RabbitMQ-如何配置条件DLX



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

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参数是否正确
  • 或者我们需要为重试创建另一个队列吗
  • 比方说,如果我想在重试10次后将消息移动到DLX?我该怎么做?是C#代码还是可以在队列上定义规则
  • 我怎么知道一条消息被重试了10次?RabbitMQ是否提供任何机制,或者我是否需要手动设计消息对象以包含重试计数

感谢您的输入

从3.5.2版开始,RabbitMQ会自动为死信消息添加一个标头,其中包含以下信息:

  • 看到消息的队列
  • 它被一笔勾销的原因
  • 死信的次数
  • 时间戳

有关更多详细信息,请参阅DLX文档末尾的"死信消息"部分。

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

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

对于重试尝试,我所做的是创建一个挂起Exchange和队列。如果要重试消息,请向队列返回肯定确认,向消息添加RetryAttepmts标头,然后将其发布到具有超时值的HoldQueue Exchange。将"保留队列死信交换"设置为将消息发送到原始队列的交换。如果重试次数过大,请检查标头和nack。

最新更新