我应该使用事务吗
客户端消费消息主要有四种方法:
- 自动确认
- 通过
Message.acknowledge()
进行显式确认 - JMS 事务
- XA
关于 XA 的讨论,请参见: 我应该使用 XA 吗
1 & 2 和 3 & 4 之间的主要区别在于,后者允许在处理过程中出现错误时回滚并重新传递消息。没有 JMS “取消确认”。因此,出于这个原因,在大多数情况下,JMS 事务应该优先于消息确认。
人们普遍误认为事务本质上很慢。实际上,从代理的角度来看,使用 JMS 事务与调用 Message.acknowledge()
在性能上几乎没有区别。但是,当交付模式设置为 持久时,会产生性能损失。这会导致代理阻塞,直到提交同步到磁盘。这类似于使用非事务性 JMS 会话时 Message.acknowledge()
阻塞的方式。
事务支持也适用于非持久性交付模式。
批量事务是处理消息的最快方式!
值得注意的是,消费持久性消息的最快方式是使用 JMS 事务结合消息批处理,例如,让提交边界涵盖多个消息,而不仅仅是一个消息。这适用于生产者和消费者,以及既是生产者又是消费者的客户端。
当使用事务时,可以以单个原子步骤发送例如 1000 个消息的批次。消息传输是异步的,因此非常快。生产者只需要在每个批次进行一次提交,以最大限度地减少由于磁盘同步而产生的延迟。