开发者学堂课程【RocketMQ知识精讲与项目实战(第一阶段):事务消息的流程分析】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/702/detail/12390
事务消息的流程分析
内容介绍:
一、流程分析大框
二、事务消息发送及提交
三、事务补偿
四、事务消息状态
一、流程分析大框
消息的发送者发送给 MQ 的消息是带有事务控制的,需要事务提交的,如果没有提
交给事务,是不能被消费者消费的。
非事务类消息,可以直接被消费,而这一类事务消息我们称之为 HalfMsg,在它发送后,MQ 会给予一个结果表示收到,此时就开始处理本地的事务,处理之后要对半消息进行 Commit or Rollback,如果 MQ 提交了,消费者就可以消费了,如果MQ回管了,消息队列就会被删除,因此消费者就会接收不到。
在进行提交或回滚时,有可能本地事务执行失败了,超时没有对半消息进行处理,
那么消息队列会对消息进行回查,它会回调检查消息状态。
检查后,本地检查方法再对消息进行处理,不是提交就是回滚 ,这就是事务消息的
流程。
其中分为两个流程:正常事务消息的发送及提交、事务消息的补偿流程。
二、事务消息发送及提交
1、发送消息(half 消息)。
2、服务端响应消息写入结果。
3、根据发送结果执行本地事务(如果写入失败,此时half消息对业务不可见,本地逻辑不执行)。
4、根据本地事务状态执行 Commit 或者 Rollback(Commit 操作生成消息索引,消息对消费者可见)
三、事务补偿
1、对没有 Commit/Rollback 的事务消息(pending 状态的消息),从服务端发起一次“回查”
2、Producer 收到回查消息,检查回查消息对应的本地事务的状态
3、根据本地事务状态,重新 Commit 或者 Rollback
其中,补偿价段用于解决消息 Commit 或者 Rollback 发生超时或者失败的情况。
四、事务消息状态
事务消息共有三种状态,提交状态、回滚状态、中间状态:
TransactionStatus.CommitTransaction:提交事务,它允许消费者消费此消息。
TransactionStatus.RollbackTransaction:回滚事务,它代表该消息将被删除,不允
许被消费。
TransactionStatus.Unknown:中间状态,它代表需要检查消息队列来确定状态。