文章目录本文来说下RocketMQ如何解决分布式事务
基本实现思路RocketMQ的事务消息状态
基本实现思路
核心思想:事务消息总共分为3个阶段:发送Prepared消息、执行本地事务、发送确认消息。这三个阶段是前后关联的,只有发送Prepared消息成功,才会执行本地事务,本地事务返回的状态是提交,那么就会发送最终的确认消息。如果在结束消息事务时,本地事务状态失败,那么Broker回查线程定时(默认1分钟)扫描每个存储事务状态的表格文件,如果是已经提交或者回滚的消息直接跳过,如果是Prepared状态则会向生产者发起一个检查本地事务的请求。
生产者向我们的Broker(MQ服务器端)发送我们派单消息设置为半消息,该消息不可以被消费者消费。再执行我们的本地的事务,将本地执行事务结果提交或者回滚告诉BrokerBroker获取本地事务的结果,如果是已提交的话,将该半消息设置为允许被消费者消费,如果本地事务执行失败的情况下,将该半消息直接从Broker中移除如果我们的本地事务没有将结果及时通知给我们的Broker,这时候我们Broker会主动定时(默认60s)查询本地事务结果本地事务结果实际上就是一个回调方法,根据自己业务场景封装本地事务结果事务回查的时间次数等配置在broker里基本流程
RocketMQ的事务消息状态
RocketMQ的事务消息分为3种状态,分别是提交状态、回滚状态、中间状态:
TransactionStatus.CommitTransaction: 提交事务,它允许消费者消费此消息。TransactionStatus.RollbackTransaction: 回滚事务,它代表该消息将被删除,不允许被消费。TransactionStatus.Unknown: 中间状态,它代表需要检查消息队列来确定状态。