RabbitMQ中Publisher Confirm模式和事务有什么区别?

What is the difference between Publisher Confirm mode and transaction in RabbitMQ?

我觉得publisher confirm模式和transaction都需要broker确认消息的接收,那为什么publisher confirm模式被认为是吞吐量比transaction更好的轻量级操作呢?

我以为transaction是同步方式而publisher confirm方式是异步方式,但是我错了,还有publisher confirm方式是同步方式。

那么RabbitMQ中Publisher Confirm模式和事务有什么区别,为什么Publisher Confirm模式提供更好的吞吐性能?

使用发布者确认。

我们最近添加了 Java 和 .NET 教程以正确使用异步 Publisher Confirms - https://www.rabbitmq.com/tutorials/tutorial-seven-java.html


注意: RabbitMQ 团队监控 rabbitmq-users mailing list 并且有时只在 Whosebug 上回答问题。

当您发布一条消息时,发布者确认会给您一个来自代理的 "yes or no" 答复,指示该消息是否已成功排入所有绑定队列(截至发布时)。为代理处理的每条消息发出确认,或者(根据规范),代理可以发出 "batch" 确认,这表明直到确认指示的所有消息都已被处理处理。 我个人不知道经纪人这样做;我认为它只是对每条消息发出一个确认。

使用这种语义,假设您有 10 条消息要发布。经纪人接受前 9 个,但无法接受第 10 个(可能其中一个队列已满)。其他 9 条消息仍在排队。

事务性让您可以选择发送 "all or nothing." 在上述场景下,如果您将所有 10 条消息作为事务的一部分发布,但第 10 条消息失败,您可以中止事务,代理将采取行动好像 none 条消息 已经发布了。此功能以性能为代价(according to the docs 在事务模式下运行时最多慢 250 倍)。

事务性确认 也是可能的 - 您可以 确认 多条消息作为单个事务的一部分。