Сохранить порядок доставки после запроса
Я разрабатываю приложение для обмена сообщениями с использованием 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 и более поздних версиях для отдельных потребителей все еще возможно наблюдать сообщения не в порядке, если в очереди несколько подписчиков. Это связано с действиями других подписчиков, которые могут запрашивать сообщения. С точки зрения очереди сообщения всегда хранятся в порядке публикации.