2017-02-15 43 views
3

Я разрабатываю приложение для обмена сообщениями с помощью 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.

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

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

ответ

3

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

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

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

+0

Да, и, как я писал: «У меня есть только один потребитель и RabbitMQ 3.6.6, но у меня все еще есть проблема переупорядочения» –

 Смежные вопросы

  • Нет связанных вопросов^_^