重新排队后保持交货顺序

时间:2017-02-15 08:16:53

标签: c# .net rabbitmq message-queue rabbitmq-exchange

我正在使用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,但我仍然有重新排序的问题。

1 个答案:

答案 0 :(得分:3)

消息排序保证下,所有内容都已得到解答here。我只想引用

  

可以使用具有该功能的AMQP方法将消息返回到队列   一个重新排队参数(basic.recover,basic.reject和basic.nack),或   由于频道关闭而持有未确认的消息。任何   这些场景导致消息在后面重新排队   RabbitMQ的队列早于2.7.0发布。来自RabbitMQ发布   2.7.0,消息始终按发布顺序保存在队列中,即使存在重新排队或频道关闭

     

对于2.7.0及更高版本,个人仍然可以   消费者如果队列有多个,则无序地观察消息   订户。这是由于其他订户的行为可能   重新排队消息。从队列的角度来看,消息是   始终保持在出版顺序中。