本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
- 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。
- 之后将本地消息表中的消息转发到 Kafka 等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。
- 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。
如上图示:
message有以下4种状态
status 0:初始状态
status 1:publisher收到broker 确认消息后的状态
status 2:消息被consumer成功消费后的状态
status 3:异常状态,需人工跟进处理
步骤如下:
step 1:message 入库(存进db),初始 status 为 0
step 2:publisher发送message到 broker
step 3:broker收到消息后返回 确认消息 给publisher
step 4:publisher收到确认消息后,更新 message 的 status 为 1
step 5:consumer从broker获取消息并执行
step 6:consumer执行成功后返回确认消息给broker
step 7