Сохранить порядок доставки после запроса

Я разрабатываю приложение для обмена сообщениями с использованием Rabbit MQ. Я использую явный ACK:

model.BasicConsume(queueName,false, consumer);

и сделать ACK после обработки сообщения:

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;
                    }
                };

Проблема заключается в том, что при обработке сообщения возникает ошибка, и Кролик не получает ACK, а возвращает сообщение в очередь в другом порядке.

Для примера есть сообщения M1, M2, M3, M4.

Если M2 был возвращен в очередь, это будет M3, M4, M2.

Есть ли способ сохранить порядок доставки?

PS У меня только один потребитель и RabbitMQ 3.6.6, но у меня все еще есть проблема переупорядочения.

1 ответ

Все ответили здесь, под Гарантией заказа сообщений. Я просто процитирую

Сообщения могут быть возвращены в очередь с помощью методов AMQP, которые имеют параметр реквизита (basic.recover, basic.reject и basic.nack), или из-за закрытия канала при удержании неподтвержденных сообщений. Любой из этих сценариев приводил к тому, что сообщения помещались в очередь в конце очереди для выпусков RabbitMQ ранее 2.7.0. Начиная с версии 2.7.0 RabbitMQ, сообщения всегда хранятся в очереди в порядке публикации, даже при наличии запроса или закрытии канала.

В версии 2.7.0 и более поздних версиях для отдельных потребителей все еще возможно наблюдать сообщения не в порядке, если в очереди несколько подписчиков. Это связано с действиями других подписчиков, которые могут запрашивать сообщения. С точки зрения очереди сообщения всегда хранятся в порядке публикации.

Другие вопросы по тегам