00:00
接下来我们说一下分布式事物里边的几种常见解决方案,首先呢,我们来说第一种2PC模式RPC呢就是我们说的二阶段提交,我们说的二阶提交协议,这个二阶提交协议也就是我们说的xa协议,它呢是在MYSQ5.5以上,SQ server2005级以上,我们这个ORACLE7以上,他们来提供支持的,我们这个二阶提交协议呢,简单的就是把我们整个分布式事务拆成了两个阶段,我们分别是这样子的,假设呢,我们这有两个,这个一个叫本地资源管理器,一个叫事务管理器,本地资源管理器呢,大家就认为是我们这个每一个服务的这个事务管理器,比如我们这是一个订单服务,这个呢是一个库存服务sto,好,那现在这是两个服务,这两个服务呢,想要做一个分布式事务,两个一起成或者一起办,然后呢,接下来得有一个总的事务管理器,总的事务管理器呢,让我们的。
01:01
那分布式事务分为两个阶段,首先第一个阶段大家呢,都给我给预备一下,就是我们总事务管理器告诉每一个微服务,你们的这些小事务管理器你们都准备好了没有,然后呢,这些小事务管理器就要检查他当前的这些数据有没有准备好,连接什么都有没有正常,能不能提交数据,如果一切都准备好就差提交了,那呢就告诉我们的总事务管理器,两个服务呢都得告诉,所以我们总事务管理器呢,先询问两个服务你们都准备好了没有,他们说都准备好了,那就就绪,然后呢,接下来总事务管理器只要收到两个人都说准备好了,总事务管理器就知道我们这两个呢,分布式事务要用了这两个微服务他都准备好了,然后接下来叫这两个人都提交,同时给他们发命令提交提交,那这个一提交二提交,那提交呢,我们就成功了,但是如果说有一个不能提交,那就在准。
02:01
准备阶段,我们事务管理器问你准备好了没有,你检查一切情况,发现呢,你能提交,那就是准备好了,然后呢,他在这儿检查一切情况,发现呢,他自己不能提交,那就是没准备好,那只要呢有一个人没准备好,那么这个事物管理器呢,那就知道他们呢不能去来提交事物,那直接要求所有人回滚,这是我们说的这个二阶提交协议,这个二阶提交协议呢,它最大的优点就是它比较简单,而且我们我们这个数据库呢,是原生支持的,特别是我们这个商业数据库,它的支持度呢也非常好,所以我们使用它的话呢,基本上少量配置就直接能用了,遵循规范标准就行,但是呢,它的缺点就是性能不理想,特别呢,不适用于我们这个大型互联网场景高并发的情况下,这种情况下呢,我们这个xa根本就没法工作了,因为他要占用大量的锁定资源,然后呢,接下来他还有各种我们这个不理想的情况,也就说一句话,我们这个xa呢,这个东西大家知。
03:01
倒一下呢比较好,但是我们的使用场景非常小,这是我们说的二阶提交协议,大家也可以去来再来了解我们的三节提交协议,三节提交呢,其实将我们整个预备又化成了两个阶段,这两个阶段呢,分别就是零二阶段,先问大家你们这些数据能否提交,然后大家呢回答能提交,然后呢,接下来他就让大家再来准备这些数据,我们来开始提交,然后大家呢就准备这些数据来提交,然后呢,最后一个阶段,只要大家都准备好了,告诉他准备好了,他就让所有人都去提交,所以划分的更详细,当然也能解决一些问题,这个呢,大家去了解一下就行了,这我们说的2PCM模式,二阶提交协议,然后接下来我们来还是要说一种叫柔性事物,这二阶提交协议呢,它看起来就是一个我们说的刚性事物,也就是说。我命令你们都能提交了,那就都能提交,只要我命令过去了,这个状态呢就是一致的,但是呢,我们在分布式事物里边,我们更多使用的是柔性事物,那什么叫柔性事物,刚性事物就是我们说的遵循a a cid这个原则的强一致性的,而柔性事物就是遵循我们之前说的base理论,实现最终一致性的,我们这个TCC事务补偿方案,他呢是怎么做的,他应该是这样,比如呢,我们现在有两个业务,两个业务呢要操作两个数据库,这是我们订单业务,这是我们的库存业务。TCCC模式呢,是将我们开发人员命令,我们开发人员呢,开发我们一个业务代码的时候,开发三个代码,相当于我们来开发上三个方法,准备人家毁掉,那这三个方法呢,分别是TRYTRY呢就是尝试这个尝试阶段呢,那就是我们预准备一些数据,接下来呢,第二阶段就是come,然后那就是提交我们把我们准备的数据。
04:54
去提交第三个阶段呢,那就是cancel,我们想要回滚我们提交的数据,比如我们之前给他加二了,那我们的cancel这一行业务代码呢,就应该写的逻辑应该是减二,当然这三块代码呢,都是我们开发人员自己编写,编写以后呢,那就相当于订单服务,库存服务,我们呢都有这三行代码,订单呢有它的串逻辑con逻辑和cancel逻辑,库存呢也有串confirm和cancel逻辑,接下来我们的这个主服务,然后呢,我们的这个管理器,事务管理器,业务管理器,他呢现在就先来执行第一阶段,那第一阶段呢,先命令大家去来预准备自己的数据,那订单服务和我们的库存服务都会调用各自我们编写的串模块的这些方法,比如实现了一个接口,这个接口里边有一个叫串lockto,我们尝试呢,锁定这个库存,所以呢,我们现在先大家都来执行串,那都执行成功。
05:54
哦,我们来进入第二阶段,大家都来提交come呢,那就是我们TRY准备的这些数据,我们在come阶段,我们可以把这些数据拿来,一提交订单一提交,库存呢也一提交,那接下来就是关键第三阶段了,只要有任何一个人失败,我们订单失败,或者库存失败,或者调用订单库存的这个大业务在最后失败了,那接下来呢,我们这个业务管理器,他就命令我们已经掉了的这两个再去主动触发他的看索逻辑,看索逻辑呢还是我们自己编写的,相当于我们给他来做一个补偿,如果原来我给这个里边加二了,我就给他减二,原来我增添了这条记录,那我就现在给他删除这条记录,这都是我们要自己写方法,那这种模式呢,在我们其实商城项目里边,特别是我们互联网项目里边用的也非常多,支持TCC15的框架也非常多,我们只需要按照人家规定的接口,把我们一个业务代码拆成三个部分就行了。
06:54
然后呢,人家会在合理的时机来触发我们哪个部分的逻辑,所以我们只需要写好我们的回滚逻辑,最重要的就是这个事物补偿逻辑,我们一直说的,你在这加二了,你最终呢就要减二来进行一个补偿,那你在这儿增添数据了,你最终就要删除数据来做一个补偿,这是我们说的PCC事务补偿方案,然后呢,我们还有一种叫最大努力通知方案。
07:20
那这个最大努力通知呢,和我们的这个下面的这个都是我们说的保证最终一致性的,比如我们来举一个例子,我们现在呢,有一个订单服务,还有一个库存服务,还有一个我们这个大业务,大业务呢,现在掉了订单和库存,结果呢,大业务在自己这儿失败了,然后呢,他就最大的努力通知库存去来解锁,他呢调用一次库存解锁方法不成了,再调一次,再不成了,再调一次,这是我们自己写的。同步的调用代码,那既然叫通知,那我们就可以改成这样的逻辑,这是一个订单,这是一个库存,这是我们的大业务,然后呢,他在下边两个都做完了,但是他在下边做我们这个用户积分扣减的时候失败了,然后呢,我们接下来订单模块就可以来发一个消息,诶我们叫努力知,所以我发一个消息给我们的MQ,接下来呢,我们订单服务和库存服务都来订阅我们的这个消息队列,而且呢,我们两个服务都能同时收到消息,我们现在呢,应该是一个topic发布订阅模式。
08:24
那现在两个服务呢,都收到了我们这个相当于大订单的创建失败消息,然后呢,我们库存服务收到这个消息就去解锁库存,订单服务呢,收到这个消息就去解锁订单,但是什么叫最大努力通知呢?就是我们害怕这个订单服务不知道我们这个消息,就是我们这个消息发出去了,我们害怕他没收到,万一这个宕机了,一直收不到,那怎么办呢?我们就这一块失败了,我们隔一秒我给他里边发一个消息,说我失败了,再隔三秒我发个消息,我说我失败了,再隔五秒我发一个消息,我说我失败了,我一直告诉你我失败了,我失败了你哪一次真正的收到我失败了这个消息,而且你把你的业务执行成功了,你就可以告诉我说行了,我知道你失败了,你不用再通知我了,这是我们说的最大努力,通知性方案,这个特别是我们在后来开发支付宝的时候,我们要支付订单,订单最终支付到底是成功了还是没成功,支付宝呢?对我们就是要。
09:25
最大努力通知支付宝呢,一会儿给我们发一个消息说你这个成了,一会儿给你发一个消息说你这个成了,一会儿发一个消息说你这个成了,当然我们这个消息不是发给我们手机短信的,是发给我们订单这个业务的,所以呢,这是我们说的最大努力通知型,然后还有一个我们说的叫可靠消息和最终一致性方案,这其实跟我们说的之前这个一模一样,我们这个大订单。现在呢,调一个订单服务,调一个库存服务,调一个用户服务,只要呢,这个大订单失败,就给消息队列里边发消息,然后呢,这些服务只要收到这个消息,他呢就自己来回滚他的逻辑。
10:04
那我们来无论是采用三四这两种的最大好处都是我们可以允许大并发,怎么能允许大并发呢?就是我干完事儿了,我不用管你的状态,我发一个消息就行了,你在后边你自己慢慢同步去,所以我们只要希望系统能达到最终的一致就行。当我们的这一块四个方案以及三方案,我们后来呢都会有相应的场景,我们还会仔细详细来说明,那大家现在呢就来了解一下,我分布式事务呢,可以用框架2PC或者3PC,或者我们的TCC模式,TCC呢相当于我们3PC的手动版,3PC呢相当于自动准备数据,自动预提交,自动回滚等等,但是我们TC呢,相当于把这些自动的东西我们整成手动的,我们写好业务逻辑,我们可以用这种一失败以后呢,就立即能帮我们让其他业务都失败了的一致性方案,当然TCC它也是一个我们说的柔性事物,我们也可以利用消息队列完成。
11:05
部门的这些通知性方案,无论是最大努力通知还是呢,我们失败了,我们就发一个消息,我通知你一下,这样呢,都是我们分布式系统里边解决分布式事务我们常用的方案,大家这些方案呢,我们后来再来详细写相关的场景例子,主要呢就是三号方案与四号方案,大家先来了解一下我们来说的这几种方案,我们下节课呢,就来使用spring cloud,阿里巴巴为我们提供的西塔,我们先来尝试一下,它帮我们如何控制我们的分布式事物,它呢,其实是我们2PC2阶提交协议的一个变形,我们可以来体会一下二阶提交协议,后来我们还会用到三四这两种。
我来说两句