首页 > 解决方案 > RabbitMQ 发布者确认订单

问题描述

我正在围绕.NET RabbitMQ 库编写一个包装器,并且据我所知,文档中没有回答一个问题,我想不出一种方法来通过实验验证它。

这里的文档说明了以下内容:

在大多数情况下,RabbitMQ 将按照发布的顺序向发布者确认消息(这适用于在单个通道上发布的消息)。但是,发布者确认是异步发出的,可以确认单个消息或一组消息。发出确认的确切时间取决于消息的传递模式(持久与瞬态)以及消息路由到的队列的属性(见上文)。也就是说,不同的消息可以被认为在不同的时间准备好确认。这意味着与它们各自的消息相比,确认可以以不同的顺序到达。如果可能,应用程序不应依赖于确认的顺序。

因此,可以无序地收到确认,我可以应付。但是,这如何与Multiple可以使用的标志一起使用?

想象以下场景:我发送消息 1、2、3、4 和 5。1 失败,2-5 成功。经纪人向我发送了一个 1 的 Nack 和一个 5 的单个 Ack,并Multiple设置为 true。如果订单得到保证,那么我知道我会先得到 1 的 Nack,然后我会知道 Ack 是 2-5。但是,如果它们可能出现故障,那么我会假设,因为我没有确认 1,Ack 是 1-5,然后当 Nack 进来时,为时已晚。

是否有保证不会发生这种情况?

标签: rabbitmq

解决方案


这是Alex 在评论中提到的 Google Group的答案。基本上,这种情况是不会发生的。

你好,

如果你得到一个 1 的单个 nack,那么一个 5 的 ack,multiple=true 这意味着 2-5 都成功了。

如果 1 延迟但 2-5 没有延迟,则您应该得到 4 个 multiple=false ack,序列为 2-5 ,然后是 1 的 nack。

如果 ack 帧使用范围而不是多个标志会更好,但我们现在是这样。


卡尔干杯


推荐阅读