forFlexibleTransactionSolutions在我们开始之前,让我们先谈谈什么是微服务。顾名思义,微服务要从两个方面来理解。什么是“微”,什么是“服务”,狭义上就是小有名气的“2pizzateam”很好的诠释了这个解释(2pizzateam最早是由亚马逊CEO贝索斯提出来的,意思是即单个服务的设计,所有参与者从设计、开发、测试、运维每个人只需要2个pizza)。所谓服务,必须与系统区分开来,服务于一个或一组相对较小、独立的功能单元,是用户能感知到的最小功能集合。场景这里就不说了,百度一大堆,大家用代码看问题吧~~。公共功能completeOrder(){orderDao::update();//订单服务本地更新订单状态accountService::update();//调用资金账户服务向资金账户充值pointService::update();//调用积分服务为积分账户添加积分}在传统单体架构的业务中,可以使用Mysql事务来保持数据的一致性。如果跨系统、跨服务、跨数据库,应该如何保持数据的一致性呢?概念介绍在理解分布式事务之前,首先要理解这两个概念:BASE理论和CAP定理。BASE理论BASE是BasicallyAvailable(基本可用)、Softstate(软状态)和Eventuallyconsistent(最终一致性)三个词组的缩写。BASE是CAP中一致性和可用性权衡的结果,它是从大规模互联网系统的分布式实践中根据CAP定理逐步演化得出的结论。它的核心思想是即使不能做到强一致性(Strongconsistency),各个应用也可以根据自己的业务特点采用合适的方法。使系统达到最终一致性。BA:BasicAvailability基本业务可用性(支持分区失效)S:Softstateflexiblestate(状态允许短期不同步,异步)E:Eventualconsistency最终一致性(最终数据一致,但不是实时一致的))CAP定理对于共享数据系统,最多同时拥有两个CAP,没有办法同时兼顾三个。二者任意组合都有其适用场景。真正的系统应该是ACID和BASE的混合体,也可以使用不同类型的服务。灵活事务解决方案的TCC入门题目要区别对待,介绍分布式事务TCC的技术方案,第一张图。实现这里,我将代码中的实现思路和方法描述一下,供大家参考。方法不一定是最好的。主要讲一个实现的基本思路。可能还有很多地方没有考虑到,需要你更正。业务中的设计阶段包括:try试用阶段:预留扣除(增加)资源confirm提交阶段:确认扣除(增加)资源cancelrollback阶段:rollbackreservedresources即每个服务提供者必须实现这三个一个完整的业务活动包括一个主要业务服务和几个次要业务服务;主业务服务负责发起和完成整个业务活动;二级业务服务提供TCC类业务操作;业务活动管理器控制业务活动的一致性它在业务活动中注册操作,并在业务活动提交时确认所有TCC类操作的确认操作,并在业务活动提交时调用所有TCC类操作的取消操作被取消了,要考虑并发问题,尽量减小锁的粒度,最大化分布式事务的并发。在单阶段Try操作中,分布式事务T1和分布式事务T2保留的部分资源互不干扰。这样,在分布式事务的第二阶段,无论T1是提交还是回滚,都不会影响到T2,这样T1和T2就可以在同一个业务数据上并行执行。允许空回滚如下图,事务协调器调用TCC服务第一阶段Try操作时,可能会因为丢包导致网络超时。此时事务管理器会触发两阶段回滚,调用TCC服务的Cancel操作,但是Cancel操作调用没有超时。TCC服务收到Cancel请求,但没有收到Try请求。这种情况称为空回滚。空回滚经常出现在生产环境中。用户在实现TCC服务时,应允许执行空回滚,即收到空回滚时返回成功。防挂控制如下图所示,当事务协调器调用TCC服务的第一阶段Try操作时,可能会因为网络拥塞而超时。此时事务管理器会触发两阶段回滚,调用TCC服务的Cancel操作,Cancel调用不会超时。之后,网络拥塞的第一阶段Try数据包被TCC服务接收,第二阶段Cancel请求先于第一阶段Try请求执行。lateTry之后,TCC服务永远不会Then收到第二阶段的Confirm或Cancel,导致TCC服务被挂起。用户在实现TCC服务时,需要允许空回滚,但在执行空回滚后拒绝Try请求,避免挂起。幂等控制无论是网络数据包的重传,还是异常事务的补偿执行,都会导致TCC服务的Try、Confirm或Cancel操作被重复执行;用户在实现TCC服务时,需要考虑幂等控制,即Try和Confirm,Cancel执行一次,执行多次业务结果相同。TCC事务组件是基于hyper实现的。实现的主要目的是加强自己对TCC交易的理解。该组件未在生产环境中使用。主要目的是先学习一个简单的思路,然后找出不足之处改正。如果发现问题可以及时联系我^^GitHub:https://github.com/LoyaltyLu/...感谢您观看这篇长文,感谢您的耐心等待,希望对您有所帮助,希望大家能提出不同的意见,谢谢!
