实现方式
通过两阶段提交的方式实现事务
具体的流程
- 发送方向rocketmq发送“待确认”消息
- rocketmq将收到的“待确认”消息持久化成功后,向发送方回复消息已经发送成功了,此时第一阶段消息发送完成
- 发送方开始执行本地逻辑
- 发送方根据本地事件的执行结果向rocketmq发送第二次确认消息(commit或rollback)。若为commit,则将第一阶段消息标记为可投递,订阅方可收到消息;若为rollback,则删除第一阶段消息,订阅方收不到消息
- 若出现异常情况,步骤4提交的二次确最终为到达rocketmq,服务器会在固定时间段后对“待确认”消息发起回查请求
- 发送方收到消息回查请求后(如果发送一阶段消息的producer不能工作,回查请求将被发送到和producer在同一个group里的其他producer),通过检查对应消息的本地事件执行结果返回commit或rollback状态
- rocketmq收到回查请求后,按步骤4的逻辑处理
4.x版本后去除了该部分功能
由于rocketmq依赖将数据顺序写到磁盘这个特征来提高性能,上面步骤4却需要更改第一阶段消息的状态,这样会造成磁盘catch的脏页过多,降低系统性能。系统中上层class还存在,用户还可以更具实际需求去实现事务功能。
支持实现事务的三个class:
- LocalTransactionExecuter:用来实例化步骤3,根据情况返回LocalTransactionState.ROLLBACK_MESSAGE或LocalTransactionState.COMMIT_MESSAGEZ状态
- TransactionMQProducer,用法和DefaultMQProducer类型,要通过启动一个producer并发消息,需多设置本地事务处理函数和回查状态
- TransactionCheckListener,实现步骤5中的MQ服务器回查请求,返回LocalTransactionState.ROLLBACK_MESSAGE或LocalTransactionState.COMMIT_MESSAGE