我正在为.NET RabbitMQ库编写一个包装器,在我所能看到的文档中有一个问题没有得到回答,而且我也想不出一种实验验证它的方法。
这里的文件声明如下:
在大多数情况下,RabbitMQ将以相同的发布顺序向发布者确认消息(这适用于在单个通道上发布的消息)。但是,发布服务器确认是异步发出的,可以确认单个消息或一组消息。发出确认消息的确切时刻取决于消息的传递模式(持久性还是暂时性的),以及消息被路由到的队列的属性(参见上文)。也就是说,不同的消息在不同的时间可以被认为是可以确认的。这意味着,与各自的消息相比,确认可以以不同的顺序到达。在可能的情况下,应用程序不应依赖于确认的顺序。
所以确认书可以按顺序收到,我可以处理好。但是,如何处理可以使用的Multiple标志呢?
假设以下场景:我发送消息1、2、3、4和5.1失败,2-5成功。代理为1向我发送一个Nack,为5发送一个Ack,Multiple设置为true。如果订单得到保证,那么我知道我会先得到1的黑牌,然后我就会知道Ack是2-5的。然而,如果他们可能出了问题,那么我会假设,因为我没有确认1,Ack是1-5,然后当黑进来时,将是太晚了。
在某些地方,这种情况是不可能发生的吗?
发布于 2019-01-17 08:45:41
这就是答案来自Google 亚历克斯在评论中提到。基本上,这种情况是不可能发生的。
嗨, 如果你用1得到一个nack,然后用multiple=true得到一个ack 5,这意味着2-5都是成功的。 如果1是延迟的,但2-5不是,那么你应该得到序列2-5的4个multiple=false nack,然后是1的nack。 如果ack帧使用范围而不是多个标志,这会更好,但我们在我们的位置。 干杯 卡尔
https://stackoverflow.com/questions/54213939
复制相似问题