分布式事务之最终一致的Mq实现
来源:互联网 发布:ff14克劳德捏脸数据 编辑:程序博客网 时间:2024/06/05 20:44
问题的起源
分布式系统的特性
对分布式系统有过研究的读者,可能听说过“CAP定律”、“Base理论”等,非常巧的是,化学理论中ACID是酸、Base恰好是碱。这里我们不对这些概念做过多的解释,有兴趣的读者可以查看相关参考资料。
这里针对一致性我们做个简单的科普:
分布式事务有强一致,弱一致,和最终一致性这三种:
强一致
- 1
- 1
弱一致
- 1
- 1
最终一致
- 1
- 2
- 3
- 1
- 2
- 3
实例描述
比如有订单,库存两个数据,一个下单过程简化为,加一个订单,减一个库存。 而订单和库存是独立的服务,那怎么保证数据一致性。
这时候我们需要思考一下,怎么保证两个远程调用“同时成功”,数据一致?
请大家先注意一点远程调用最郁闷的地方就是,结果有3种,成功、失败和超时。 超时的话,成功失败都有可能。
一般的解决方案,大多数的做法是借助mq来做最终一致。
如何实现最终一致
实例分析
我们是怎么利用Mq来达到最终一致的呢?下面让我们来一起进行详细的分析:
订单业务分析
首先,拿我们上面提到的订单业务举例:
在我们进行加订单的过程中同时插入logA(这个过程是可以做本地事务的)
然后可以异步读取logA,发mqA
B端接收mqA,同时减少库存,B这里需要做幂等(避免因为重复消息造成的业务错乱)
复杂的混合异步业务调用
那么我们通过上面的分析可能联想到这样的问题?
- 1
- 2
- 3
- 1
- 2
- 3
第一种情况:假设a,b,c三者都正常执行,那整个业务正常结束
第二种情况:假设b超时,那么需要a给b重发消息(记得b服务要做幂等),如果出现重发失败的话,需要看情况,是终端服务,还是继续重发,甚至人为干预(所有的规则制定都需要根据业务规则来定)
第三种情况:假设a,b,c三者之中的一个失败了,失败的服务利用MQ给其他的服务发送消息,其他的服务接收消息,查询本地事务记录日志,如果本地也失败,删除收到的消息(表示消息消费成功),如果本地成功的话,则需要调用补偿接口进行补偿(需要每个服务都提供业务补偿接口)。
注意事项
- 1
- 1
上面的话我们该怎么理解呢,举个例子吧:
比如A给B转账,A先自己扣钱,然后发了个消息,B这边如果在这之前销户了,那重试多少次也没用,只能人工干预。
阿里在分布式事务采用的解决方式
阿里部分业务是用Mq实现了最终一致性,也有一部分业务用了tcc事务,但是tcc事务用的比较少,因为会侵染业务,开发成本比较高,如果体量不大的话直接用jta或mq支持事务就好,其实在分布式事务这一块还有一种最大努力型,也比较无脑的一种方式。
- 分布式事务之最终一致的Mq实现
- 分布式事务之最终一致的Mq实现
- 分布式事务之最终一致的Mq实现
- MQ实现分布式事务
- 分布式事务方案:可靠消息最终一致方案
- MQ 解决分布式事务的一些思路
- 分布式事务-最终一致性
- Java互联网架构-深入理解MQ实现分布式事务
- 分布式事务解决方案一之:可靠消息最终一致性
- 分布式之分布式事务的消息队列模式实现
- 分布式消息最终一致性事务
- 分布式事务?No, 最终一致性
- 分布式事务?No, 最终一致性
- 基于Go实现的分布式MQ
- 基于Go实现的分布式MQ
- 微服务~分布式事务里的最终一致性
- 微服务~分布式事务里的最终一致性
- 小白的web优化之路 三、使用MQ来实现事务异步处理
- php获取客户端真实ip地址的三种方法
- 在串口通信开发中实现自动查找串口端口的方法
- memcached学习笔记
- Java解析前台传过来的json数组
- main()函数的参数
- 分布式事务之最终一致的Mq实现
- 13、Oracle:多表连接和临时表的使用
- 多层iframe嵌套使用相互取值
- Xamarin XAML语言教程基本视图ContentView
- 锯齿与抗锯齿
- JDBC工具类
- git迁移远程代码库(从remote a到 remote b)
- 请实现一个类,时时刻刻记录内存中类的对象的个数
- manjaro linux 使用vmware时NAT无法联网问题解决