我正在使用Rabbit MQ开发一个消息传递应用程序。我使用显式ACK:
model.BasicConsume(queueName,false, consumer);
并在处理消息后执行确认:
consumer.Received += (ch, ea) =>
{
try
{
var message = Encoding.UTF8.GetString(ea.Body);
Logger.Info($"DeliveryTag={ea.DeliveryTag}, message={message}");
((EventingBasicConsumer)ch).Model.BasicAck(ea.DeliveryTag, false);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
};
问题是当处理消息时出错并且Rabbit没有收到ACK时,它以 不同的顺序将消息返回队列。
例如,有消息M1,M2,M3,M4。
如果M2返回队列,它将是M3,M4,M2。
有没有办法保持交货顺序?
P.S。我只有一个消费者和RabbitMQ 3.6.6,但我仍然有重新排序的问题。
答案 0 :(得分:3)
在消息排序保证下,所有内容都已得到解答here。我只想引用
可以使用具有该功能的AMQP方法将消息返回到队列 一个重新排队参数(basic.recover,basic.reject和basic.nack),或 由于频道关闭而持有未确认的消息。任何 这些场景导致消息在后面重新排队 RabbitMQ的队列早于2.7.0发布。来自RabbitMQ发布 2.7.0,消息始终按发布顺序保存在队列中,即使存在重新排队或频道关闭。
对于2.7.0及更高版本,个人仍然可以 消费者如果队列有多个,则无序地观察消息 订户。这是由于其他订户的行为可能 重新排队消息。从队列的角度来看,消息是 始终保持在出版顺序中。