我有一个活动队列,它将包含来自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。