关于AMQ中的事务 ActiveMQDT
程序员文章站
2022-07-14 18:53:22
...
(1)、JMS事务和XA事务真正唯一的不同之处在于,XA事务中,在Prepare阶段,broker必须写所有接收到的命令(如:发消息或者应答消息)到持久化存储中,目的是broker以后能够正确的进行恢复操作。
(2)、【TransactionStore】事务存储进行事务处理,它会缓存所有的消息和应答,直到发生commit或者rollback操作;除了存储消息外,事务存储还会抑制消息的分发,直到session的commit命令发生。
(3)、采用事务后,发送消息或者应答消息的命令,实际上被缓存起来,直到commit和rollback命令发生,才会真正进行对应的操作,如:发送或者应答。
(4)、commit和callback命令需要在session调用,但是事务(提交或者回滚)是在broker端进行处理的。
(5)、【TransactionStore】实现了所有的持久化适配。
(6)、建议:JMS事务用在TextMessage上,以批量大小决定是否commit,比如每500个消息commit一次,前提每次commit前不能超过缓存的水位线。
(7)、文件切分成BypteMessage进行发送时,不能以一个文件为一个事务,因为文件大小是可变的,而缓存大小是固定的,超过水位线就会触发流控制发生,导致逻辑上的“deadlock”。
(8)、考虑下:为什么事务和批量发消息在一起?为了限制每次提交消息的大小(消息缓存时对jvm消耗),如果消息比较小,每次批量的数目可以多点,如果消息比较大,每次批量的数目应该小点。
(2)、【TransactionStore】事务存储进行事务处理,它会缓存所有的消息和应答,直到发生commit或者rollback操作;除了存储消息外,事务存储还会抑制消息的分发,直到session的commit命令发生。
(3)、采用事务后,发送消息或者应答消息的命令,实际上被缓存起来,直到commit和rollback命令发生,才会真正进行对应的操作,如:发送或者应答。
(4)、commit和callback命令需要在session调用,但是事务(提交或者回滚)是在broker端进行处理的。
(5)、【TransactionStore】实现了所有的持久化适配。
(6)、建议:JMS事务用在TextMessage上,以批量大小决定是否commit,比如每500个消息commit一次,前提每次commit前不能超过缓存的水位线。
(7)、文件切分成BypteMessage进行发送时,不能以一个文件为一个事务,因为文件大小是可变的,而缓存大小是固定的,超过水位线就会触发流控制发生,导致逻辑上的“deadlock”。
(8)、考虑下:为什么事务和批量发消息在一起?为了限制每次提交消息的大小(消息缓存时对jvm消耗),如果消息比较小,每次批量的数目可以多点,如果消息比较大,每次批量的数目应该小点。