我认为发布者确认模式和事务都需要代理确认消息的接收,那么为什么发布者确认模式被认为是比事务具有更好吞吐量的轻量级操作?
我以为事务是同步风格,而发布者确认模式是异步风格,但我错了,有同步风格的发布者确认模式。
那么RabbitMQ中的PublisherConfirm模式和事务有什么区别,为什么PublisherConfirm模式能提供更好的吞吐性能呢?
当您发布消息时,发布者确认将向您提供来自代理的“是或否”答案,指示该消息是否已成功排队到所有绑定队列中(截至发布时)。确认是针对代理处理的每条消息发出的,或者(根据规范),代理可以发出“批量”确认,这表明确认所指示的所有消息都已被处理。 我个人并不知道经纪商这样做;我认为它只是对每条消息发出一个确认。
使用此语义,假设您有 10 条消息要发布。代理接受前 9 个,但无法接受第 10 个(可能其中一个队列已满)。其他 9 条消息仍在排队。
交易让您可以选择发送“全部或全无”。在上述场景下,如果您将所有 10 条消息作为事务的一部分发布,但第 10 条消息失败,您可以中止事务,并且代理将表现得好像“没有消息”被发布。此功能是以性能为代价的(根据文档,在事务模式下运行时速度会慢 250 倍)。
事务确认也是可能的 - 您可以确认多个消息作为单个事务的一部分。