分布式事务解决方案一之:可靠消息最终一致性

SOA场景下,会出现调用远程插入数据,本地插入数据失败后,远程存在脏数据的问题,为此可通过
可靠消息解决分布式事务的最终一致性。
场景:先调用远程插入数据,在调用本地插入数据,实现消息的最终一致性,假设都只有单表插入数据,其他业务不做处理


主要流程分支如下:
1.远程插入失败,发送error消息,本地接受到error消息,不做插入处理--结果:都为插入
2.远程插入成功,发送ok消息,本地接受ok消息,本地插入失败,发送error消息(带有remitrecordid参数方便远程自己回滚)
3.远程插入成功,发送ok消息,本地接受ok消息,本地插入成功,发送ok消息


可能问题:
1.远程插入失败,发送的消息我没收到,没问题啊,我也没插入,你也没插入
2.远程插入成功,发送ok消息我没收到,导致我本地没有做插入,解决方案可以把消息持久化数据库,定时查询远程发送OK消息,但是本地未接受的消息,对本地做插入操作
2.远程插入成功,发送ok消息,本地插入失败,发送error消息后远程没收到,没有回滚远程的数据,没问题,消息持久化定时查询本地发送error消息,远程未接受的消息,对远程做回滚操作
3.远程插入成功,发送ok消息,本地接受ok消息,本地插入成功,发送ok消息的远程没收到,没关系,我插入了,你也插入了嘛

关于消息持久化的参数:
消息内容:json字符串形式,比如{"ppMerchantNo":"0000000110000044","productCode":"WECHAT","providerCode":"0000000","remitRecordId":"MHRMT20170810101647200wFDJ6we","settleRecordId":"MHCAL20170710151931024HSCEOLc","status":"error"}
消息状态"已发送,已接收
消息内容的状态:ok,error,配置出来这个是因为我们如果远程发送给本地Error消息,本地没收到,对双方都没影响,我直接不处理了,可以减少定时补偿消息和数据的数量
消息发送者:本地
消息接受者:远程

猜你喜欢

转载自blog.csdn.net/zhangxiaomin1992/article/details/77040802