【问题标题】:keep order of delivery after requeue重新排队后保持交货顺序
【发布时间】:2017-07-03 19:00:30
【问题描述】:

我正在开发一个使用 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;
                    }
                };

问题是当处理消息时出现错误并且Rabbit没有收到ACK,它将消息返回到队列中 不同的顺序。。 p>

例如有消息 M1、M2、M3、M4。

如果 M2 被返回到队列中,它将是 M3、M4、M2。

有没有办法保持交货顺序

附:我只有一个消费者和 RabbitMQ 3.6.6,但我仍然有重新排序的问题。

【问题讨论】:

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


    【解决方案1】:

    here消息排序保证下回答了所有问题。我只是引用

    可以使用 AMQP 方法将消息返回到队列 重新排队参数(basic.recover、basic.reject 和 basic.nack),或 由于通道关闭而持有未确认的消息。任何 这些场景导致消息在后台重新排队 早于 2.7.0 的 RabbitMQ 版本的队列。从 RabbitMQ 发布 在 2.7.0 中,消息始终按发布顺序保留在队列中,即使存在重新排队或通道关闭

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

    【讨论】:

    • 是的,正如我所写:“我只有一​​个消费者和 RabbitMQ 3.6.6,但我仍然有重新排序的问题”
    • 您解决了吗?我们有同样的问题。我们希望一条失败的消息一直排在队列的前面,防止其他消息被处理,直到该消息被解决
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2019-06-09
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多