马士兵 MCA 架构师课程笔记(六十七)

系列 6:P109:分布式场景系统中数据一致性问题如何解决 - 马士兵学堂 - BV1RY4y1Q7DL

我走不动。好,那个这是今天我们呃今天一晚上的所有的课程内容,然后。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个我们讲一下分布式场景中数据一致性的问题如何解决。因为分布式就是涉及到多个服务或者多个数据库之间数据的同步,就是是吧?比如说现在比如说这是服务一服务2,然后每个服务挂一个库,每个服务挂一个库。

怎么能保证这两个服务和两个库之间数据的同步呢?这是我们今天的课程的主题呃,还有就是。分布式事物问题比在在面试中就是分布式事务和分布式锁,它是呃几乎是做分布式系统必问的一些问题。

然后这里面呢我会把分布式事物的解决的思路,在这节课里告诉大家,呃,这个思路有几个目的。一个是你在面试中回答的时候,能把它说清楚。第二呢,就是你知道这个思路之后,你在学习后面的分布式事务的方案。

那你就会更加的从容。好了,这是第二点啊。然后还有就是呃我会在课程里面介绍一下两阶段和三阶段提交协议,就这两个协议。对学习后面的分布式事物就是特别有帮助。虽然是一些理论性的基础,但是你把它掌握了之后。

不管你学以后的西塔还是LCN都会有一些帮助。然后再有就是第四点组合。存储中间件如何解决数据一致性的问题。这个大家能理解吧?比如说我这里面写了两个reis和myscle。也就是说你在一个方法里。

比如说是你的方法,你在一个方法里呃调用了,比如说set呃KV就调用了reis,然后也也update了,就是update了一个数据库是吧?这是第一个调用reies,第二个调用呃myscle。

如何保证它俩的数据一致性呢,这是个这是我们要解决的这个问题,还有就是什么是TCC然后TCC的解决方案是什么?这个我们课程里也会说到第有就是如何利用本地事件表实现分布式事务,这种这个实现事务的解决方案呢?

就是不不需要引入额外的任何组件,只需要利用本地的一些特殊的设计,就可以完成分布式事务,这个就比较简单也好理解。第七点呢给大家解呃那个讲一下最大努力通知方案是什么。好了。

这就是我们今天晚上要讲的所有的内容。大家脑子里应该大概有个印象吧。刚才有个同学问讲西塔吗?西塔必须得讲啊,必须得讲西塔。我们讲两阶段和三阶段的时候就会讲西塔。然后讲TCC的时候也会讲西塔。

我们都是基于西塔框架实现的O。可以吧。然后听这个。这节课所有的内容就这些。然后呃听这个课的时候呢,建议大家认真听讲,然后该问问题的时候,我会留出时间让大家问问题,要不然就会拖慢我们讲课的速度啊。老师。

这个上周不是讲过吗?是啊,上周讲过。是的,上周讲过,因为这个这个是公开课。啊。公开的话公开课的话,我们就是因为就是内容有一些重复。如果呃我们VIP课里的话是不重复的。啊,好了,我们开始可以开始讲课了吧。

😊,嗯。😊,听你们的啊,确定就写一啊,有有有疑问就把疑问打出来。曹老师听十遍都行。好,那你听着啊。好了,开始上课了啊。😊,好啦。😊,好了,开始上课。好了,讲课的。讲课之前我们从一个场景来入手。

因为我们做技术的,好多人都以为我们做技术的,其实就感觉是一种特别伟大高尚的职业,是吧?我也这么我也这么认为,但是。谦虚一点说,我们技术其实就是个服务行业,我们是为业务服务的,脱离了业务。

你说这技术还有什么用?是吧这这个大家能理解吧。😡,就是虽然我们敲着键盘是吧,拿着鼠标感觉是吧?自己不种田不种地,感觉现在玩高科技是吧?但是其实我们不是这样的是吧?我们是为业务服务的。

所以我们的技术都要围绕业务产景出发。O好了,业务场景。给大家说两个例子。第一个例子。大家如果用过第三方支付的话,比如说用过呃支付宝或者微信用过这两个吧,直播间里用过的同学。直播间里用过没有?用过是吧?

OK好的,用过的话应该知道。比如说这是一个服务。举个例子啊,这是一个服务,就是我们呃一个serverer,他提供一个web外b接口,让别人来调用。然后这个呢也是一个web服务,提供一个外b接口。

让别人来调用。首先我们把这个人理解成第三方是吧?第三方收到钱之后,调用我们的服务。然后我们的服务呃,支付服务,更新数据之后,这边一般的指的是支付的流水,就是更新完支付流水之后。

我们再去更新我们的业务服务。业务,比如说是订单。是吧比如说我们系统里呃买了一个东西要成交一个呃,比如说买了一个手机,要付款,付完款之后,这个款是打到了第三方。打到第三方之后,第三方来回掉我方的系统。

那么我方的系统一般是这么做,它先回掉我的支付系统就告诉我,你把哪个订单给我支付了。我想把支付流水给改了。这样的话我知道我的订单是支付完成的状态。然后同时再去修改我们的订单系统,把订单的状态变成已支付。

一般的是分这么两步进行的。这两步呢也会涉及到两个服务。比如说支付服务和订单服务,这里面每个服务呢都挂了一个数据库。我们呢我们这节课的目的就是要保证这两个服务之间数据是一致性的。这个老师说的这个。

目的大家能ge得到吧?能不能get到,能get到就敲一。OK好了好了,这是这是一个例子啊。其实这种例子非常多。还有一个我们大家更好理解的理解的例子就是比如说我在电商业务中。

比如说有这么一个业务场景叫下单。下单的话,比如说这是用户,用户要去购买一部手机。举个例子,他买一个手机之后。😊,它会生成一条订单,比如说某某某某年某月某日呃,买了一个手机多少钱?

是吧多少多少多少多少人民币是吧,这是一条订单记录。OK但是在生成这条订单记录的时候,因为它要下单嘛,下单在生成这条订单记录之前,他会去判断一下库存还够不够。在一般的大型电商系统中会涉及到。

其实在那个一般的大型电商系统中,它这个下单的服务会非常的复杂。有直播间里有做过电商的同学吗?直播间里有没有做过电商的同学?有的话给老师敲个一,小马这么多同学都做过是吧?你没有啊,有是吧?做电商的。

有过做电商的同学应该知道下单这一步我图中画的是比较简单的,但是它实际会非常的复杂,它会涉及到比如说销售层,就是库存这个服务,它会有它会有很多层。比如说销售层的库存,然后还有调度层的库存。调度层的库存。

还有就是仓库层的库存。okK这是这个服务就分了好几级。我这个里面只不过是把它。抽象成了一级,统一叫做库存服务。做过电商的同学应该能理解这三个层是做什么意思,做什么的吧。能不能理解这块儿。

如果不能理解的话,我们呢我们有我们有零基础的小白项目课,这里面我们都把这些说的说的很清楚。就是在一些大型电商系统里,一个库存就分这么多层。然后只不过是我在这个例子中呢,把它呃抽象成了一个库存。

就是它去调库存,先把库存减去一个。比如说要买一个手机,就是把库存减1,然后订单呢加乙,这时候是两个服务,两个库,这边又是一个服务,一个库,理解了吧?我们的目的。

我们的目的就是要保证这两个服务和这两个数呃,这两个库之间数据是一致的,就是不能说库存减了,然后订单没增,或者说订单增加了,结果库存没减,没减,这就尴尬了。能理解我们我说的这个例子里面,我们的目的吧。

分多餐还有载图量。嗯,你说的对啊。好了,哎,那个叫载途库存。好了,能理解是吧?能理解我们就继续了啊。😊,好了,在刚才我们所说的场景就是分布式事物要解决的数据一致性的场景。在我们讲那个分布式事物之前呢。

我们先来熟悉一下我们最就是最开始上学的时候,就最开始接触事物的时候,事物到底是个什么样子。事物是什么样子?😡,事物就是用户定义的一系列数据库的操作。这些操作可以视为一个完整的逻辑处理单元。要么。

要么全部都执行,要么全部不执行,主要就是这个。也就是我们前面所说的那两个服务,要么。这边增加这边该扣的扣掉,他俩同时执行,要么他做不成,他也得回滚。能理解吧,就这两个是一个原子操作,要么他俩都干。

要么他俩都不干,不能说一个干了,一个没干,这就不是这就不是事物了。O事物就是不可分割的工作单元。这是我们最开始学事物的时候,它的一些定义,同样把它迁移到我们分布式事务中,它的定义还是这个样子的。

OK好了。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们往下看一下事物的这几个状态,我们快速过一遍ACID大家都理解吧,原则性、一致性、隔离性和持久性ACID怎么做的?😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ACID通过什么实现呢?就是当今事物的时候,ACID通过什么实现的?就是它最底层的技术是通过什么做的?ACID最底层的技术。有木有人知道?数据库是我是数据库事务呀。

是数据库事务日志数据库锁blogMVCC说的都对。它其实最重要的就是通过锁和日志做的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

理解吧?其实就是锁和日志,最底层就是用了这两这两个技术,把数据把那个数据库的事物给它实现了,就是锁和日志。在数据库里面有一句话。数据。就是日志比数据重要。那大家能不能理解这句话,就是数据可以丢。

日志不能丢,就是日志肯定日志比数据重要。就是一般的操作数据之前先写日志,这是在数据库里面有这么一句话,大家能理解吧?我跟才所说的这些,这都是数据库的基础知识。为啥?呃,为啥稍等一下啊。至于为什么的话。

我给你我给你一个东西,你去找我们的咨询老师。呃,要为啥就可以了。因为这节课我们不讲扫描屏幕右下角的二维码,找我们的咨询老师去要一些资料,你就知道知道为啥了。因为我们这节课是讲分布式事务这些东西呢。

我就我这节课里不讲,但是我也给你提供了资料,你扫描屏幕右下方的二维码,让我们的咨询老师给你一些数据库的基础的视频,它里面都会有的OK可以吧?这个这个G。😊,好了,我们往我们往下走啊。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在实现事物的时候,我们一般怎么做的?我们一般怎么做?打一个标记,就是一个开始标记,得声明这是一个事物的开始。事物开始之后,我们执行业务逻辑,执行业务逻辑之后再给事物收割尾,就是开始结束。

中间是业务逻辑。这个大家能理解吗?这个是比较基础的数据库的知识。能不能理解能力的话是敲一。嗯。能理解能理解是吧?好的。😊,好了,然后这个begin try三个就是标记标记事物的开启。

然后commit呢表示事物的提交,也就是落库,这个也就是刷到磁盘中落盘。然后这个row back呢就是回滚,就是把原来做过的反悔,就是全部撤销,这叫回滚。然后中间就是也有逻辑。O这个基础理解的。

我们后面学分布数的时候就会简单好多啊。我们先回忆一下好了。在我们单体的服务和单个库的情况下,怎么实现分布式事物呢?如果我们用如果做过这方面同学的话,如果我们用呃用spprintring框架的话是吧?

加一个艾特出来三个人注解就OK了,是吧?这是做单体服务挂一个库的时候,用这个就可以,是不是?这个用过吧。😡,艾着出三个人住去。有没有用过?用过的就敲一。O ok好了。😊,好了,嗯,我知道这人问啥好了。

这不是我们这节课的重点,我只是带大家回忆一下。😊,啊,好了,前面说的是事物最基础的一些概念。我们进入我们这节课的正题,分布式事物。OK分布式事务是什么?它它的应用场景是这个样子。

前面我们也讲了一些案例是吧?比如说一个用户的请求进来之后,他请求想打到这个服务上。这个服务通过调用这个服务。和调用这个服务完成它整体的业务逻辑,明白什么意思吗?比如说一个下单请求。

就是用户发出一个下单请求,先他先调用到这个服务。比如说呃这是个user服务啊,就是对接user的一个service。然后user服务呢要调用订单服务。然后要调用库存服务,能理解吧?或者说库存在前。

订单在后,因为先判断库存在呃在新增订单,或者说他调了订单,订单再去调库存返回之后再去新增订单都是可以的。我这个图画的这个意思呢,就是呃不一定这么做,但是通过这个呢,你应该能清楚。

就是说会涉及到一个请求调用多个服务以及多个库的场景。而我们的目的就是要保证。这两个服务。就是这是一个服务这是一个服务,这是一个库,这是库这两个服务以及他们对应库之间数据的一致性。

这就是我们要讲的分布式数物跟前面那个前面那个只是调用一个相对应啊。好了,我们开始往我们开始往下了啊。😊,嗯。好了,分布式事务是指会涉及到操作多个数据库或者多个服务的事务。大家这块注意一下啊。

其实就多个数据库或者多个服务。好多同学以为一个一个服务调用俩库,就不算分布式事务,其实也算,只要你涉及到多个库或者多个服务。比如说这是一个服务,这是一个服务,他俩调了同一个库,这也算分布式事务。

ok这块理解吧,就是一个服务调多库,多个服务调一个库。也算一个分布式事务。其实就是将对同一数据库或者对同一服务的事物的概念扩大到了多个数据库或者多个服务。目的是为了保证分布式系统中数据的一致性。

O这个这个大家都可以理解吧,这样我我应该把分布式事物。😊,他所涉及到的各种各样的场景都给大家说说清楚了,理解是吧?okK好了,那我们继续啊。好了,我们往我们往下。😊,我们先来分析一下思路。呃。

分析就是解决这个问题的思路,我们该从哪里入手呢?大家想象一下啊,我给大我给大家看一句话,看完不知道大家能不能知道它的一个整体的思路。分析这个就是分布式事物数据不一致的原因,是因为事情做了无法后悔。

大家能不能理解,大家想把这句话记在脑子里,事情做了无法后悔。然后我给你详细的解释一下,为什么说事情做了无法后悔呢?大家想一下啊。一个用户发一个请求到订单,订单调一个请求到库存库存。比如说减一。

也就是说买一个商品,库存减一,减完一之后,库存给订单一个响应,响应就是说我减一成功,然后呢,订单收到这个响应之后,在订单里insert一条订单。这个大家可以理解吧。

就是insert orderinser一条记录。O当它insert的时候,这边报错了。这边报错,怎么让库存服务回滚呢?大家思考一下这个问题。如果我们要让库存服务回滚,我们应该怎么做?最笨的办法。

我们说订单服务再给库存服务发一个请求呗,说发一个请求,你把刚才你做的那些事给我撤掉,这也可以。但是我们在实际调用中,这条链路只是发过去发过去有响应执行,然后给用户一个响应。

这个事情只能这么做OK只能这么做。也就是一条链路只能这么做,但是中间没有我所说的那个后悔的这么一个步骤。就是说订单告诉库存服务,你要后悔,没有这个理解了吧?所以这个就是我我前面所说的这句话的意思。

就是事情做了无法后悔,所以说它是导致两个服务之间数据无法一致的一个原因。这块我说清楚了吗?这话说清楚了吗?有清楚的话,你就敲个一,我就知道你清楚了,我就继续了。清楚是吧?好嘞好嘞。

那他无法反悔我们实际工作中怎么去做呢?其实我们软件设计的好多解决思路,其实大部分是来源于工业设计,不知道大家能不能理解我说的这句话,大部分来源于工业设计。这句话如果不能理解,就当我没说啊。好了。

能理解的swift理解是吧?swift的理解是吧?能理解更好啊。然后这些设计呢也有一部分是来源于我们的生活。😊,生活中怎么做这些无法让我们无法后悔的事情呢?大家有没有想过这些这个东西?

生活中怎么做这些让我们无法后悔的事情呢?就是这个事我只要做了,他就定了,我就没法后悔了。那么我为了保证他的万无一失,我该怎么去做?惹女朋友生气,时光倒流,遇啊,青云青云说玉对了吗?是吧?彩排嘛。

先试一把嘛,预言。是吧先试一下,如果说都能成功,那么我就彻底去做了。如果不能成功,那我就不做了,能理解吧?彩排这个事儿能不能理解?也就是说我原来去做我原来去做这两件事儿。第一次做了,然后他又去掉了它。

结果他回来之后,他出错了,我是无法让它进行回滚的。如果有彩排之后,我怎么我怎么做,我先调它哎,你先试着做一把,然后他掉它试着做一把,然后他说成功他试了一下,说我成功了,但是我实际是吧。

可以不是最终的抵销,这只是我。预预演一遍是吧,这叫什么演习一下是吧?又不是真打你是不是?然后完了之后给他一个成功,结果执接他的时候错了,那没关系,我又不是真打。那我这边回过我这边是吧,做了。

相当于没做是吧?能理解能理解这个意思吧?😡,能不能理解这个意思,能理解是吧?OK好了,然后在演习的过程中,是需要有这么一个中间的第三方来收集演习的信息的,也就是说两个他做对了,他做对了。

都汇总到一个人这,然后这个人说哦,你们这你这哥俩都做对了,那我们正式去做吧是吧,去吧,然后说如果有一个做错了。然后这哥们说,哎,不行,他做错了,你做的也不算是吧,你俩重来一次是吧?所以。

得有一个得有一个中间人来收集这个信息是吧?像鬼谷子说的是吧,裁判可以这么理解是吧?才可以叫裁判是吧?在春晚中呢就叫导演,是不是?是不是就这个意思,然后在分布认1务中呢,我们就叫呃TM是吧?

叫transction manager事物管理器或者说事物协调器,这就是一个第三方的角色。OK这个你要理解清楚之后,就明白了LCN和西塔为什么需要启动一个第三方中间键OK彩排这个我说清楚了吧。

从彩排里面我也说出了需要需要一个协调者。这个清楚这个也清楚吧。会不会有这种情况,彩排没问题,但是正式就有问题了。会的。会的啊,你说的这个问题会的。

但是我在后面会讲到这个live just for love。是吧为爱为只为爱生,只为爱活着,是不是?好了,我后面你把你这个问题记住,后面我会讲到这个问题的啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系列 6:P11:Java线程模型 - 马士兵学堂 - BV1RY4y1Q7DL

在这里讲的一些个内容呢,感觉都比较深入一些,大家凑合听啊,能听懂多少是多少,你也感受一下,现在大厂的问的都是哪方面的东西,其实凡事你只要能够打好的话,现在涨个薪水什么的,那跟玩一样,给大家15秒钟。

你扫一下这些题,尤其是没有呃读过的那些同学,对于底层,对于锁,对于多线程不是很了解的,读一下,这是19年到20年一线大厂的,他们的关于多线程和锁这方面的面试题,黄老师还在吗啊,黄老师,黄老师还健在。

怎么了,他才25岁,正常的情况下,52度都会在,lucifer,这个和b站一样,这个和b站不一样,好多陌生词汇是吧,steam,25怎么了,25不行吗,25也可以有牛人的,周志磊,周老师什么背景。

他是原来民生银行的架构师嗯,我25的时候还是个废物,如果不学的话,52也是个废物,讲讲吧,太磨叽了就不讲了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使劲儿磨叽,聊会天嘛,讲着玩嘛,不要天天讲技术,我现在把技术都讲的,我自己都快讲吐了,如何才能当架构师,嗯需要有一系列的努力路径才可以啊,不废话了啊,我们开始讲今天的内容,看都有人着急了。

开始给我带节奏了,好看这里啊,不开玩笑了啊,呃我花两天呢给大家讲一些,现在面试之中问的非常多的这一类的问题,由于它牵扯到很底层的内容,牵扯到很基础的内容,所以呢我想从基础和底层来给大家讲起。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先呢在这呢我先给大家解释一些基础的概念,如果这些概念你不理解的话,估计大厂的面试就跟你说拜拜了,看这里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嗯我重新画图吧,我重新画图的话呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家会看的更清楚,拿手工给你画一下,好看这里啊,我我呢首先给大家解释一个最基本的概念,这个概念呢叫用户态和内核态,关于这个概念,那个不清楚的同学给老师扣个二,我看有没有必要讲多少好吧,嗯好大家看这里啊。

这个呃如果把这件事要讲清楚的话,实际上得从那个操作系统的历史开始讲起,呃,我玩操作系统呢当然玩的比较多,因为我的年龄比较大了嘛,最早的操作系统我是玩过那个os two。

然后最早那个苹果机的making top,那些个操作系统,当然大家比较熟悉的应该是dos操作系统,不知道有没有同学玩过,当然还有win 31文九五啊,文文文文2000,win 7 win 8。

win 9 win 10,各个各个操作系统呢,以前的操作系统有这么一个特点,什么特点呢,就是一个是应用程序,能够直接把操作系统给干掉,啥意思,如果我们从专业一点的角度来说,相当于什么呢。

相当于这是我的操作系统程序,然后呢,这是我的应用程序,然后这个操作系统的程序和我们的应用程序,它们两个是同权的,什么叫同权的,就是我也可以访问同一块内存,你也可以访问同一块内存。

那我这个程序要是不怀好意的话,我就能直接把你操作系统内存给你给你干掉,把里面的值给你改了,还有一种呢是我也可以控制硬件,我的我的应用程序也可以直接控制硬件,那我把某个硬件呢给你干掉。

把格式硬盘给你格式化了等等,总而言之,那个时候呢,应用程序和操作系统这两个软件没有区分开来,所以就会诞生,经常的操作系统运行运行某个程序就死机了,就蓝屏了,这块大家能不能能不能够理解这个,理解到这一点。

大家伙都比较年轻嘛,没有经历过那个时代,但是你能够想象得到吗,唉能应该能想到现在呢,作为一个应用程序来说,很少能把操作系统给直接干死,原因是什么呀,原因是他们做了一个分权处理,分权处理的意思是。

把这哥们儿的权重等级给提高了,这个操作系统能干的事,好多应用程序是不能直接干的,比方说什么事呢,直接跟硬件打交道,去接收网络的数据,去访问,直接访问内存,比如比如说跟那个键盘,跟显示器等等打交道。

这些操心都能干,应用程序干不了,那有同学会说,我应用程序写的程序也可以控制你,你那个显示器上显示什么呀,我也可以读网络数据啊,那这时候怎么做的呢,这个时候由于它的权重降低了,就变成这样子了。

app啊是跑在可以认为是跑在操作系统的外围的,需要和硬件打交道的部分,都是要经过操作系统的帮忙才可以有一老大啊,这就是你们的老大,你写的应用程序都需要调用操作系统,对外所提供的那些个库函数,系统函数。

你得需要通过操作系统提供的,这些个核心的功能,你才能完成自己想要的一些操作,所以我们可以简单说,操作系统是工作在内核态,而应用程序是工作在用户态,这样的话,我操作系统能管理的东西就会比较的底层和直,接。

不让不让我们的应用程序直接去干掉,我们那些个硬件,从这个角度来讲,我们操作系统就会更加的安全,所以现在的操作系统很少有应用程序,直接能把它给干掉,给卡死掉的,来,能get到这点,同学老师扣一。

那有同学说老师这跟高并发有半毛钱关系吗,这是高并发的底层的核心,大家知道作为java来说,我们我们讲清楚是第一个问题之后,我们来讲第二个问题,第二个问题是什么呢,第二个问题是看这里。

第二个问题是java的,线程模型,有同学说老师这个java线程模型,那还有什么特殊的吗,不就是有一个thread吗对吧,或者是new一个rnable,再new一个thread。

或者new一个colorable,再new一个thread,无论如何不都是要new一个thread吗,这东西有有还有什么模型吗,有它的模型在于哪里呢,在于是作为java来说,同学们,你们想一下。

它是用来运行class文件的一个虚拟机吗,而我们的jav程序对于操作系统来说,它就是一个普通的应用程序,站在操作系统角度,你jvm和你的qq啊,和你的office啊,没有人没有半毛钱区别。

都是运营在我用户态的这样的一些个应用程序,那现在这个问题又来了,作为这个class里面,它能够启动好多好多的java的线程,这个大家应该知道,嗯随便画个图吧,来简单说啊,用这个来表示线程。

这是java里面的一个线程,一个thread,第二个第三个作为一个java整理来说,它可以启动好多个线程,那现在的问题是,这些个线程在操作系统的这个级别,它到底是怎么运行的,这就是java的线程模型。

它的一个底层机制好听我说作为这个东西,jvm虚拟机规范并没有做出任何要求,这标题拟机的规范呢并没有做出任何要求,他什么意思呢,就是说你这个一个线程在这,你扎到里面的jvm级别的这种线程。

这是jvm级别的线程,好作为这种线程来说,它在操作系统的级别底层到底怎么来实现,它并没有做出具体的要求,那么hosport是怎么实现的呢,这几个名词都不用我解释了,什么叫jy m虚拟机。

什么叫hosport,应该是不需要我解释的,对不对,那可以继续的给老师扣个一,这不是不是,这不是内存模型啊,这是线程模型,hosport是java虚拟机的一种具体的实现。

目前也是应用最广泛的是oracle公司的实现,hot sport是啥,jvm虚拟机的一种具体实现,oracle对于jm实现好,你们练到这种程度的,下次就别问问题了,好好安安静静的听就行了,你们不开口。

没人知道你们好看,这里,作为jpm来说,一个线程启动的时候对应的是什么呢,对应的是操作系统级别,也有它的内核线程,操作系统呢有它自己级别的内核线程,就是操作系统底层要实现的时候。

管理的是一系列的内核线程,这线程呢我们简单简单称之为k,这是操作系统级别的建筑,好好好听,我说目前java虚拟机的实现也就是hot sport的实现,它是怎么实现的呢,这个时间叫做一比一。

就是一个内核线程对应一个操作系统,对应一个虚拟机级别的线程,好久不一一画这箭头了,大家理解什么意思就行了,目前它的实现是一个一比一的关系,有同学说老师难道还有除了这个东西之外,还有别的对应关系吗。

有go语言的是什么,有多少同学知道go语言的,go语言的线程模型是什么,当然它的线程不叫线程,叫什么叫线程对吧,腾讯的面试县城和县县城的最准的区别,我一会给大家讲几道腾讯的面试题,它也比较好玩。

go语言的编程模型它是什么一个实现呢,注意它和具体的操作系统内核的线程,它是一个m比n的关系,当然还有其他虚拟机的实现,还有其他虚拟机实现什么,就是我的用户的虚拟机级别的线程。

对应的可能是底层的一个线程,m比一的关系,n比一的关系也是有可能的,当然也没有那种111比n的关系,这个很少,作为java来说,他就偷了个懒,为什么说go语言叫天生支持高并发,是因为go呢。

我一会儿给大家讲啊,go语言呢呃它底层的这种m mba的模型呢,就相当于一种自自然而然地实现了java的线程池,这样一种关系,而作为java来说,他就偷了一个懒,这个偷懒的意思就是说,hosport。

透露了,线程调度交给了操作系统,啥意思,就是hosport特别懒,hosport一个实现就是我jvm级别出一个线程,我就在我的jvm实现里面,直接去启动一个操作系统级别的线程就可以了。

我不需要在用户空间里头做一些线程,这方面的管理,比如说县城所,比如说线程调度好,所有的这些事情都交给操作系统,老大来帮我完成,这是一个很核心的概念,但是go语言不是go语言,它的线程是在操作系统。

是在我的用户空间,这个级别做了很多很多的管理操作,他们之间的同步,他们之间的通信都是发生在我们的用户空间的,所以站在这个角度讲,就有这样一种提法,这个提法是这样的,认真听重要的概念来了。

这个提法呢叫做java的线程模型,叫重量级线程,而go语言的编程模型本身的线程它也叫什么呀,叫轻量级线程,线程呢也是一种线程,但是它属于轻量级的轻量,在什么地方,重量又在什么地方。

轻和重的最主要的核心的点就在于,要不要通过老大带我管理,再强调一遍构造携程是吧,哦ok ok你说的很对啊,没错他说的很对啊,这个我错了,对不起,勾脚携程go routine啊,专业名词叫routine。

就是我需不需要操作系统参与调度,这个就叫重量和轻量级的最根本的区别,再说一遍,所以后你看到重量级,轻量级,还有还有一种一些一些专业的名词,叫什么重量级锁,轻量级锁,这都是什么概念,什么叫重,什么叫轻。

非常简单,记得这个概念就可以,就是需要操作系统参与调度的,这个叫重量级,不需要操作系统参与调度,只需要我自己的在用户空间就可以搞定的,这部分内容叫轻量级,需要内核态,不不能说需要内核态啊。

就原来这个概念我讲的太粗了,不是说需要内核态,因为好的内核态你总是要翻译成汇编语言的,但是你像这种java这种线程模型,就需要操作系统来帮你管理,帮你做现成这方面的一个调度。

帮你做出锁之间的一个同步来帮你做这事,我的虚拟机没做,我把麻烦事都交给我老大了,ok这种实现叫重量级,因为你需要经过一个老大的处理,但是有一些叫轻量级,为什么叫轻量级,因为我不需要经过老大处理。

不需要请出这么重要的人物出场,这个叫轻量点,好了来能get到这一点,同学老师扣一,那看这里,大家明白这个概念之后呢,有同学说老师那说了半天go语言,你能不能聊一聊这个go语言的,它的一个携程的一个实现。

go routine的一个实现,它到底是什么样的呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

听我说歌手听的一个实践呢,算了,这个图我就不放了,节省时间,歌手听的时间是这样子的啊,勾入定的时间,看这里作为go语言来说,它的一个一个的线程称之为携程,专业名词叫go routine。

如果学过go语言呢,这个我需要给大家写一个go语言程序吗,应该不用了吧,go and我刚刚给过期了,还准备用vs code了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是不管他。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

呃作为go语言来说,如果你有一个函数,想让它启动一个不同的呃,这种携程的话应该怎么处理啊,比方说我有一个函数,是不是就这么写啊,go f哎就可以了对吧,同学们就这么来处理,平时我们调用的时候。

我们写f就是对于函数的调用,而我也是个f呢,就相当于我开启了另外一条通道,开启了传统意义上的一种另外的线程,f在这边执行我的mamain函数呢,继续往下执行,ok所以它的叫做go语言叫什么。

天生支持高并发吗,天生支持高并发啊,这字写的好难看,这是我的字吗,天生之至高秉范就在于这儿,就是它特别简单,注意这个天生支持的意思,并不是说java不支持,而且java要实现这个功能非常麻烦。

但是呢作为go语言来说呢,它就特别简单,就一个go这个关键字就可以了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

非常的简单,那它的底层模型到底是什么样的呢,底层模型的在于它每要启动一个携程的时候,就没启动一个go routine的时候,注意它和我们的内核线程是一个什么关系呢,是一个m b n的关系,bn好。

我们来聊一聊它具体的一个实现,同学们,你们认真听,作为go语言里面呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系列 6:P110:分布式事务的设计思路分析 - 马士兵学堂 - BV1RY4y1Q7DL

好了,刚才这个清楚了吗?😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有可能导演得病了。对,这个问题我后面也会讲啊这个问题这个猫猫喵猫喵还是这个我后面也会讲这个我后面也会讲,你俩记住啊,为爱活着,还有这个猫。嗯。好啦。😊,我后面会讲到的啊,先说这个清楚了就敲一。

比喻很形象是吧?能理解就好啊,就是比喻不比喻的,主要是为了方便大家理解啊。好了好了,然后我们我把这个缩小一点,还是放这吧。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样的话我说大家提问的会方便一些。好了,然后通过前面我们所说的我们所说的一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析。那么我们知道分布式事物处理的关键是必须有一种方法,可以知道事物在任何地方所做的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有的动作,其实这个就是我们刚才所说的一个第三方是吧,或者说裁判或者叫协调者知道事物在任何地方所做的任何动作。也就是你要知道在这个服务里做的事和在这个服务里做的事。

提交或回滚事物的决定必须产生统一的结果。也就是说让你俩你俩先试最后你俩都没问题,我说提交你俩都提交。我说回滚,如果说有一个有问题,我说回滚,你俩都回滚。

这样的话就将他们的提交和回滚统一了一起统一在了一起。这样也就保证了数据的一致性。O这就是我们通过前面的思路分析,我们得出的一个结论。O好了,那么我们在我们的整个服务的架构中呢,我们就引入了这么一个东西。

这个东西叫协调者就是你服务该调你的服务,调你的服务,该调调去。但是呢参与参与这个事物的这两个服务需要给协调者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

呃,做一次汇报。也就是说这两个服务里需要集成跟协调者通信的组建。这个理解吧,大家能不能理解?就是根据我前面所说,我们推论我们推推论出这么一个东西。OK理解是吧,所以。😊。

这个能力的话就知道我们我们我们所说的LCN呀,或者说se塔呀,西塔这些框架,为什么需要在每个服务里引入一个se塔的架包,再加一个艾g个程的注解,主要就是为了跟第三方进行通信。

也就是说在这两个服务里面做改造。okK好了,那我我们我们就继续了啊。好了,然后分布式事物说分布式事物呢,还有一个东西就是一些呃理论性的东西。这个大家也得知道。

就是叉A规范是叉open组织定的一个叉A的规范。然后这个规范里面涉及到三个角色APTM和RMAP就是应用程序,就是我们平时写java代码的地方是吧?我们的外部地方写java代码主要集中在这个地方。

然后TM叫做事务管理器要协调者,也就是我们前面所分析的第三者啊,不是第三方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后再有就是RMresource manager。resource manager呢就是我们所说的。买C口你可以这么理解。O现在的话这三个角色大家都清楚了吧。我们的代码第三方。

mycyclcle也就是我们的数据库。这么说就清楚了吧,你们就不用看百度百科里那么那么长篇大论的一些东西了,就没有必要了。你记住这仨就就可以了。OK好了,然后我们往下走啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后这三者的关系关系是这个样子的,我们的应用程序和第三方做交互okK然后第三方和IM做交互,他们之间做交互。OK就是他们之间进行相互的交互。这个图呢无所谓,我们到时候写代码,我们到时候拿代码来过一遍。

你就知道他们三个人之间的关系了。OK好了,这个图像放这里啊,到时候我们拿代码去看它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,我们往往下走。拆规范总结一句话,什么话,就是事物协调者与数据库之间的接口规范。为什么它叫规范呢?是吧?为什么它叫规范,其实就是啥事不干,指定规矩是吧?就是什么事也不干,指定一些规矩。

然后让全世界所有的人来遵守他这个规矩进行开发。是吧这个可以把它理解成。我们的JDBC就是和GDBC的地位是同等的是吧?就是。J twoEE是吧,它定义了JDBC的规范。

然后呢my circlecle是吧?然后呃oracle是吧?然后circle server,然后DB two是吧,等等等等。一些数据库的厂商来实现GDBC的规范。OK然后拆规范也是同样的道理。

我定义了分布式事物的解决方案。然后你们每个数据库厂商自己去实现它去。ok 。能理解吧?乌龟的屁股规定对,然后乌龟倒立。上面规定是吧,规定在上面是吧?好了,这个这种这种东西我们就过了啊,我们先过了啊。

好了,叉I规范的实现在分布式集群下,一般的加代理层来充当TM的角色,实现对事物的支持。叉I规范是吧?它主要都定义了一个第三方是吧?第三方跟其他人的就TM和AP和RM之间的交互。

那么这里面其实我们额外引入的就是1个TM。因为前面的东西呢,外部程序和数据库我们都是必备的,我们只需要额外引入1个TM就OK了。好了,我们往下走。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两阶段提交协议和三阶段提交协议就是根据这一思想衍生出来的,就说前面有差异规范,然后所后面才有了两阶段和三阶段提交协议。两阶段提交协议主要保证着分布数的原则性,以及所有的节点,要么全做,要么全部不做。

这个是比较重要的一套理论。这个理论呢支撑了后面好多框架的实现。比如说LCN啊C塔啊都是两阶段的两阶段的实现。然后把这个学了,你再学它们,那就非常简单了。OK好了,我们现在开始学习两阶段提交协议。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

OK好了,往下走。两阶段提交协议呢,我呢不准备从那个。😊,就是那些特别理论的什么第一阶段投票啊,那些开始,我准备从一个实际的例子来给大家讲,就是讲完这个例子,我估计你对两阶段提交协议。

基本上80%就掌握了。好了,实际的例子是什么呢?就是这个西式的婚礼。大家可以看一下啊,图中所画的三个角色,这个这哥们儿是一个服务。它是一个服务,它也是一个服务。他挂着一个数据库。他也挂着一个数据库。

就是他们两个是独立的两个服务。然后这个呢是一个第三方啊,这是牧师是吧?你从穿着上应该能看出他是牧师,不是是第三方啊,不是第三者,这是第三方。好了,我们来我们来看一下啊。

第一阶段就是牧师给这个服务发一个请求。说你愿意娶这个这个女人吗?怎么着怎么着怎么着,然后他发个誓,等会儿我把微信和钉钉退了。那么太吵大家了。好了,这是D,这是牧师给他发出去的一个请求。这个请求就是让他。

😊,去做一些事情,他去想一下这些事情是吧?我先彩排在我内心里先彩排一下,这是我能不能做。然后呢,然后他心里嘀咕嘀咕了一会儿,可能当时也没想是吧,已经嘀咕好了,嘀咕了一会儿说我我愿意,然后呢。

牧师又向他发一个请求,说你愿意嫁给他们怎么着怎么着,然后他也嘀咕了一会儿,说我我愿意这就是两阶段中的第一阶段,他向他发请求,他说他愿意给他一个响应,他向他发请求,他说他愿意给他一个响应。这样的话。

这个第三方协调者是不是就收到了两个服务执行没有问题的一个反馈的结果,说这俩都愿意ok这就是这就是第一阶段就完成了,就是彩排先完成了。那你们俩先有个心理准备,是不是这是第一阶段,然后呢,第一阶段完成。

如果都说愿意的话,那么就进入第二个阶段。第二个阶段就是牧师,然后再向他发一个请求,说那你就提交吧,说既然如此,面向对方握住双手宣告那个发个誓交换个戒指是吧?这就是最后落库了,知道吧?

就是这件事已经已经敲定了,落库了,就是就是持久化到磁盘上了,然后他呢然后开始开始心理经过复杂的心理斗争,哎呀,我某某某怎么着怎么着怎么着好了,落库踏实了。然后这边呢也向他发一个请求说是吧?

你赶紧你也你你你你也落库吧,你也持久化吧,反正你俩都没问题是吧?然后他就说我愿意嫁给他,他说他愿意娶他是吧?不管以后离不离的,反正现在都先同意了,然后最后失误完成。

保证了数据一致性也就是说他执行的业务逻辑,和他执行的业务逻辑。目前来说保证的是一致的,就是说他想娶,他想嫁。不会说在第一阶段的时候,他想娶,他不想嫁,牧师也不会说是吧,说你愿意你愿意娶他吗?他说他愿意。

然后他你愿意嫁给他吗,他说他不愿意,牧师也不会也不会那么尴尬的发起第二阶段嘛,是吧?应该应该不会啊,所以这就是两阶段保证了最终的数据一致性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok。好了,这个通过这个例子,大家应该大概理解脸就段是干嘛使的了吧。😊,单方反悔。嗯。咱现在先不讨论这个异常情况啊,异常情况后面再讨论,先把正常的流程我们搞清楚,理解了吧?理解的话给老师敲个一。嗯。

好好吧,老老宋我又来了,你6岁的孩子来了吗?😊,牧师不愿意了啊。没关系,牧师不愿意,又不是他姐啊,好了,老宋的儿子也来了。好了,往下走啊。好了,通过前面的学习,我们大概知道两阶段整体是一个干嘛的。

但是我们还是得把两阶段快速的过一遍,两阶段分为。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

投票阶段和提交阶段。第一阶段叫投票阶段,就是这个第三事务协调者向每一个服务发送一个请求,就是投票预预提交。然后每个服务呢执行事务,大家注意执行事务,呃。

回到我们的那个实际编码中就是执行我们的circle语句。大家看我这只是执行circle语句。还记得我们在最开始所说的begin transaction action执行业务。

然后commit或者row back吗?还记得这句话吗?还记不记得刚才我所说的这个第一步、第二步、第三步。记得是吧?如果记得这句话,大家应该看到我这边写的这个只是执行事务。

也就是说只是执行我的第二步并没有提交。也就是说第一步开始了,第二步执行业务,没有干别的是吧?等着最后的提交,所以这就是第一两阶段的第一阶段只干这么点事。然后同样的道理,这边的服务也是这样的。

他也不干别的,只是执行业务,并没有说我们的第三步他也执行完了。okK这就是第一阶段投票阶段。好了,往下走。如果在第一阶段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有的操作都为同意的时候。也就是说两个服务执行的都没有问题。那么我们的系统进入第二个阶段,第二个阶段就叫提交阶段,提交阶段怎么整,就是他给他给每个服务发请求,说提交去吧。然后大家注意一下。然后服务里面。

这里面会有一句话释放资源。大家理解一下这个这个字啊,就是这边把把它所发的请求给它提交掉,提交完了之后把资源给它释放掉。你想把这几个词记在脑海中,一会儿我会总结两句段的时候,把这些东西都给大家讲到。

就是它的优点缺点,就这几个字释放资源。理解啊,释放资源之前呢,它肯定要进行提交或者回滚。因为资源一旦释放了,它就失去了对数据的控制权。所以在释放之前要么提交,要么回滚。

此时我收到的是提交O这是正常情况下是提交。然后完了之后给他一个响应,反馈一个结果,最后完成事务。OK这是正常情况下,那么异常情况下呢。就是说在第一个阶段,有一个参与者返问是no。

就是有一个服务执行出错了,协调者在规定时间内没有收到参与者的反馈。也就是说,那个第三方在那等你给他发了个请求,等他的响应,结果没等到他的响应丢了,还不知道怎么了,或者他服务挂了,没等到。那么。

就属于我们所说的这个第二种情况,协调者在规定的时间内没有收到参与者的反馈。此时,两个条件满足其一就发送回滚的指令。回滚的指令怎么发送,就发发一个回滚,说你回滚嘛。然后这时候他利用本地的日志进行回滚。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家注意一下,利用本地的日志进行回滚。其实这个里面还是利用到了我们我们单击的事物的。原理就是单击事物的实现机制。单机的事物的机制,这个应该理解吧。为什么我跟他说日志比数据重要呢?

也就是说数据可以丢无所谓。只要日志在,我可以对它进行潜滚,也可以给它进行。回滚。这个能否理解?嗯,Ladiesd and gentlemen,现在能不能理解?把这些点都记着,一会儿我会总结的时候。

把你们的疑问全部一个一个给你们解开。好了,能理解就好啊。好了,那么这边的服务呢也同意我们快速过过完就OK了。好了,没了好了。😊,前面就是两阶段的正常情况和异常情况,我都给大家说清楚了。

但是它里面会有各种各样的问题。包括大家刚才也提问了好多,你们提问的那些问题呢,都在我这张PPT里,我全给你总结出来了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,刚才有一个人说牧师不愿意了呢,或者牧师挂掉呢,那就是单点故障。也就是说协调者是吧?有的叫TMtry三个man,有的叫TC叫try三个coordinatorTC如果他挂了呢,那整个事物就无法保证了。

就是两个服务,不知道谁给他发指令,也不知道他给谁响应这个指令,所以他挂了就有单点故障。okK这个说清楚了吗?这个清楚了吗?清楚是吧?好吧,那么第一个清楚,我们说第二个,第二个阻塞资源占用数据库连接。

导致性能低下。这什么意思?还记得我刚才所说的在第二阶段有一个东西叫释放资源,还记得吧?释放资源。示放的前提是占有为什么要占有资源?大家想一想,为什么要占有。你比如说我执行了一些circle,我不提交。

我等着协调着给我发指令,让我去提交,我再提交。在我等待的这段时间内,我能不能把资源放掉?思考一下这个问题,在我等下一步指令之前,我能不能把我占用的这个数据库的连接给它放掉?不能是吧?好了。

这个大家都达成一致啊,不能是吧?喵喵喵喵和这叫。这叫新名子名是吧,还是新名呀?能且听且且听风盈,冒出一个棱。那我给你解释一下它不能为什么不能?如果它释放掉了,比如说这是一个外b服务。

外包服务连了一个数据库。我现在通过这个连接操作了一些circle, update date insertser等等等等,操作了一些circle。然后我把连接释放掉了。下次我再建立一个连接。

我能提交上一个链接操作的。是事物吗?就是上一个连接操作的这些srcle语句吗?能不能?且听且吟。且听分吟,能不能。这个应该很好理解吧。肯定不能啊是吧,肯定不能是吧?这个那哥们呢那哥们且听风吟啊。

不能好了,你已经理解了啊。好了好了,我就当你理解了啊,所以说连接必须占用,不能释放掉。冲冲冲。太莽撞了,怎么又能怎么又能呢?哎呦,我的天,清楚了吗?这句话就阻塞资源。占用资源。

所以占用了数据库的连接这个连接如果它占用了,比如说数据库的连接有100个。你100个请求来了,这100个请求占住了。那么第101个请求来了,没没有连接去服务了,所以会导致性能低下。这个我说清楚了吗?

说清楚的同学敲个一。清楚了是吧?好了,哎,这个清楚之后,我们接着说第三个。数据不一致,两阶段出错,数据不一致,什么意思?举个例子啊,这是第一阶段。定一阶段的话,我给你发一个请求,说你去执行吧。

给你发一个请求,你去执行吧。结果你你俩都说都可以,那么我就会进入第二个阶段。第二个阶段我就会说你去提交吧,叫commit是吧?然后呢也会给他发一个请求,说你也去提交吧,commit结果。

这个请求在路上丢了。OK这个请求丢了。😊,知道吧?所以他执行了他没有执行。所以就会导致数据不一致了。理解吧?因为一共就这两个阶段,我们第一次为了防止单向调用的连接,无法后悔。我们加了连阶段。

但是两阶段第二阶段又出错了,我们没有其他的服务做保障了,所以数据就不一致了。这块能不能理解?也就是说,两阶段会有数据不一致的场景。真正结婚的时候,新娘和伴郎跑了。对。就最后让交换戒指的时候是吧?

然后然后斑郎实在看不下去了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

抱着新娘的就跑了是吧?这也挺尴尬的是吧?新郎那边数据执行完了,落库了是吧?然后新娘跑了也会有这种情况啊,那怎么办?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,这个问题我先给你说怎么办?我举一个实际例子,回滚不了了,也没法回滚是吧?新新来还可以回滚是吧?去民政局把结婚证撕了,换成那个换成离婚证,这都可以。但是实际中可以那么搞是吧?因为人是活的。

那么在我们的系统里怎么搞呢?是吧?系统里要要要有备份,举个例子啊。😊,第一个服务,比如说订单服务。第二个服务叫库存服务。订单服务呢要做一个事叫insert订单,这个大家能理解吧?就是插入一条订单。

库存服务就是uper date的一个库存减一是吧?uper date的一张表里,将那个将那个库存字段减去一个一。然后减去一之后没问题,这边insert order加一个一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系列 6:P111:两阶段提交协议、三阶段提交协议 - 马士兵学堂 - BV1RY4y1Q7DL

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者insert不好理解的话,大家该这么这么来理解啊,insert啊,不是阿巴 data一个字段all呃从一把它变成2,这是一个状态啊。就是说这边比如说库存有两个,就是从二变成一就是少一个库存。

然后这边呢当它做成功之后,把订单里面某一个状态,从一改成2来这块这两个事物能不能这两个事物的操作,我说清楚了吗?这块说没说没说清楚。清楚了是吧?好了,那当遇到数据不一的情况该怎么办呢?是吧?

我们可以写circle。去检查检查一下,比如说这个表里它是不是2,如果它是2。我去看这个表里是不是一,如果是一,说明这俩人啥也没干是吧?就是连连那个教堂都没去,在去之前就反悔了,那无所谓,不管了。

如果说这边改成了一。也就库存变成了一,少了一个,结果这边还是一。现在是不是就不一致了?因为如果它变成一。下面这个应该变成2,这才是数据一致性的,结果到这就不一致了,这是一种情况,这是一种异常的情况。

那么还有一种情况。那就是他。是2。然后呢,他。变成了2。就说这个还是原来的二,就是库存没少。结果这边呢订单把状态变成了2。能理解吧?此时这也是一种不一致的状态。这个能不能理解?要么就是它是一,它是一。

这都是不一致的。它上面库存是一的时候。下面的订单应该变成2,这才是正确的是吧?这是正确的。然后一一也是错误的。好了,如果你知道数据哪种情况是正确的,哪种情况是错误的,那么你是不是就知道哪种情况下出问题?

比如说这两举这两举这两个例子,这两个例子出问题了。它上面是一,也就是从二变成了一,结果下面是一,下面是一,我怎么整,要么把它。调成2。要么把他调成2。能理解吧?也就是说上面是一和上面是一。

下面就必然是2,上面是2,下面必然是一,这才是正确的状态。要么只能把它俩都调了,要么。从这个例子,要么它减去一个一是吧,要么它减去一个一就是一个货的关系,这个能不能理解?就是我们发现异常数据之后。

手动给它改掉。能不能理解能不能理解我说的这种方式?能离的话就敲一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果不能理解,把你的问题打出来,手动改是不是很累,当然很累了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好啦。前面有个同学说手动改很累是吧?当然当然是很累的了。所以在好多大公司里有一些脚本一直在线上跑着批量的去修改你的就是一些监控类型的脚本在线上跑着。当发生数据不一致的时候,它会这些脚本会去自动执行。

能理解吧?这些脚本会去自动执行。理解吧,什么时候去现证数据,这个取决于你的业务。举个例子,当。😡,比如说现在是呃8点52,举个例子,现在是8点52,那么我的脚本肯定要去查吧,是吧?先去查分两步。

第一步去查。第二步去改是吧?那么查的时候是不是查这个数据before是吧,再。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

8点50之前的OK8点50之前的数据,我要看它是不是符合一致性。如果不符合,我把它改掉。如果符合拉倒。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

能理解吧?可能有的有的人查的,我说的是8点50,这个条件你可以自定义是吧?你可以选成是8点45到8点50,就是用between去查是吧?between45到50,然后这个查过之后。

再between50到55,然后再beten55到60,能理解吧,就是分阶段分阶段的去查一批一批的去扫描。OK这话能理解吗?😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

万一两个业务服务都是更新操作呢,我刚才所说的不就是都是更新操作吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我刚才所举的例子都是更新操作呀。你好好想一下。为什么要执行这些脚本?因为为了防止数据不一致,这是这叫这叫兜底的方案。兜子咋写呢?就是裤兜的兜兜底的方案。OK你也可以把它弄说成是降级的方案。

这个不同的公司定义不一样啊,能理解吧?前面我所说的这个意思能对吧?从手动变成自动。能力他的目的是做啥吧?这是目的啊。我一开始就是要。😡,啊,对,就这个意思啊,麦多的都老师再讲一次。花了马,如果你。

大厂真的都是这样做的吗?当然。好啦。我晕。啥啥意思,你晕了,还是我说的不不不明白。来,这块清楚的同学给老师敲个一。再讲一遍吧,清楚的敲个一,不清楚的敲2,我看看有多少人需要讲,有多少人不需要讲。

因为这是公开课照顾大多数同学。好了。好了,这是一一的一的多一些啊。😊,好啦。😊,怎么二又多了?好尴尬,如果不懂的话,你可以扫描屏幕右下方的二维码,让老师给我拉群给你解答就行。

你你把问题提交给屏幕下方的二维码,到时候我给你解答啊。好吧,可以吧?这样跳二的同学,我也给你提供了你的解决的渠道,你可以扫描右下角的二维码,到时候我会让咨询老师联系我,我给你解答,好吧,这样可以吧?😊。

一对一比这样集中集中解答,更能节省一些其他的时间啊。好了,这个问题就过了啊。😊,讲快点,太慢了。这个刚才还有的同学说可整的快呢,还让冲奖,你说我怎么整,所以。😡,一个一个来啊。确实慢。那你说咋整。

速度正好,有的说快了,有的时慢点,说速度正好行吗。我们看代码啊。我们看下代码吧。是的,每个人理解都不一样啊。坏的同学呢,你先忍一忍是吧?等会我现在起段代码,大家直接看代码就好了。😊,众口难调是吧。

那个这个你你自己调整你自己的时间啊,时间在你在你手里把握着是吧?😡。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等等,我请一下服务。我想一个一个起,把这仨服务,这个是一个库存服务。然后这里面呢一个订单服务。然后。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不影响那个PPT啊,我想把它去掉。我把地我把那个代码起来,你们应该就差不多知道知道怎么啥意思了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Yeah。好了,先把代码上上来啊,然后我再给你。打开一个数据库。idea该更新了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个很重要吗?再说了,你怎么能看出我idea的版本呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是吧下面该更新了是吧?2020年1月3号的差不多了。才过了10个月嘛?不就是啊没必要啊。好了。然后我现在给大家看一下我的数据库。然后数据库呢,我这边有两个库,这一个库这是一个库。然后这个库呢是库存。

然后这个里面呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

商品ID我写个一,然后。呃,库存我写个100吧。OK就是我现在去购买一号商品,一号商品有100个库存。大家记着啊,然后呢,我去新建一个这个订,这是订单库,订单库里什么也没有。OK好了,然后现在我来。

我来做这么一件事儿。好了,大家先先理解一下我所说的这个业务啊,先调库存服务去扣库存。我们执行这个接口,这是订单服务里的这是订单服务里的一个接口。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是吧啊那个old add,然后点进去之后,它去调了一个库存服务的接口。这个这个ID呢我一会儿会传进来,它传的是一,然后呢,我也会把它写到呃,先看这个吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

固I在这收,然后我传进来的是一个一,然后呢把它调过去,然后他去调用库存服务,然后减一。然后我这里面呢模拟了一个异常是吧?就是说。执行订单新增的时候出错了,但是在库存的时候没有错。来家看一下啊。

库存的时候没错,然后代码在这里。是吧库存直接就看它是吧,把这个库存减进去一个一,然后直接就更新掉了。okK代码很简单。好了,然后我们现在开始直接请求。😊,好了,我先请求一下啊。😊,好了。

报1个500错很正常是吧?这是我故意模拟的500错。然后大家看一眼啊是吧?这是50错是我们故意模拟的。然后我们看一下数据库。数据库呢大家看一下,原来是库存是100。我们看一下它的结果变成了99,对吧?

库存少了一个。是不是?然后订单呢?并没有新增,看到问题了吧。来这块如果能看到问题的同学给老师交一。代码很简单,问题看出来了吧,库存少了一个一,调这边的服务少了一个一,结果这边的服务呢想加一没加上。

是不是就数据不一致了?O所以这就是我们这节课要解决的问题。好了,怎么解决这个问题呢?很简单。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

嗯。大家看一眼,马上就解决了。然后等他起来,我把数据恢复一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

库存给它变成100吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

。好了,我们现在再来请求好吧,还是跟他的请求走走一把。好,还是报50错。然后我们看一下日志。😊,还是报500错,错误跟跟他一模一样。然后现在看库存。我们期万的库存是多少?是不是报错了。

就是两个服务之间处理出错了,是不是库存不应该少100是吧?然后刷新一下,不停的刷新还是100,订单呢也不增加。😡,是不是这就对了。😊,能理解吧,现在能理解吧?所以说现在这个问题我们已经解决掉了它。

改对了。😊,怎么控制的,你先看结果。怎么控制的,我会告诉你的。来,结果能理解吧?就是我现在实现了这么一个功能,把它给把这个问题给解决了。能理解吧?好了,结果能理解的话,我们我们看一下它怎么做的啊。

首先怎么做的,首先得启动一个。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第三方这个第三方叫西塔是吧?大家可以看到我是用我是这么启动的,然后怎么启动的呢?它在这里有一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个组件叫西塔。ok。😊,你直接执行它启动就OK了,是吧?直接进行它启动OK了。😊,然后它里面会有一些配置,然后配置的话呢,你可以去这里看,然后叫registtry count。然后大家可以看一下这个。

然后这个配置里面呢,我我在需要修改的地方都加了修改两个字。你如果拿到这段代码的同学呢,你你看修改的地方就可以了,是吧?我这里面用了配置了一些注册中心,然后呢呃这里面用了fill。

这个type用的fill,这个都不用改,这个是它默认的fill,然后fill呢对应的是file点com是吧?然后我们去看file点com,然后点开。大点com这里面我也写了修改,需要修改的地方。

这个大家现去自己看就可以了,然后往下走,主要是store这块目呃,我用的是DB,然后DB呢对应的对应的数据库的配置是这个样子的。OK是不是是配置数据库的呃连接。

就JDBCULU的 password这些东西,这些简单好了,这就配完了。中间件就配完了,这是我们前面所说的第三方协调者。那么我们呢再来看每个服务需要做些什么。其实如果你都用默认的话,每个服务很简单。

只需要引入一个架包。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

引用一个价包就可以了。阿里巴巴的sta架包就OK了,别的不用。知道吧?然后这个服务也是别的,不用,只用阿里巴巴的一个战包,别的不用。然后呢,在order里面,也就是说在服务开始调用的地方。

大家可以看一眼,在服务开始调用的地方,我写一个global transaction省。把它当成一个全局事务,就加一个这么一个注角。原来不是艾 try三嘛,现在写gbal try三就OK了。理解吧?

现在理解要做这几件是吧?然后还有你去网上会找一些文章,会在或者说在某个在服务里还要配置呃配置这些呃result下面写fi andcom和 rejection co。其实这些不用默认情况下不用也是可以的。

你只需要引入一个炸包。这块引入一个炸包,然后加一个注解。就O了。加一个注解。就OK了,别的没啥。怎么用清楚了吧?然后想要这套代码的同学呢,扫描屏幕右下方的二维码,招募的咨询老师去要就OK了。

很简单很简单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

没有吧。然后代码呢,我大概给你过了一遍,然后其他的呃其他的细节呢,你扫描二维码,要代码就可以了。and度log表需要自己创建吗?需要需要自己创建。

大家可以看到我在呃我在每个服务里都创建了一个安度log表,这个都需要自己创建的啊。ok k。好了,这个都需要自己创。因为每个服务的回滚都需要依赖自己的自己库里的andlog。然后这个西塔呢。

它对两阶段做了一个优化,大家知道优化在哪吗?好了,现在我给大家讲一下s塔的优化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

西塔把这个阻塞资源给它优化掉了,就是西塔里面这个两阶段没有这个了,它优化掉了。为什么说西塔是一个高性能的分布式事务解决方案呢?是吧?毕竟阿里的东西它必须得承受高性能的考验。为什么它高性能的nction。

大家思考一下,如果让你去解决性能低,你怎么去解决。西塔怎么解决的?大家思考一下啊,它。性能的平静点在哪?在占用连接是吧?占用数据库的连接,也就是这个这是它的平静点,它怎么解决呢?

它解决的办法就是释放连接是吧?只要把连接释放掉,我就知道我我就提升了我的性能了。先说这个点,先说这个思路,大家能不能理解?思路能理解吗?能理解是吧?好了,既然思路我们能达成一致的话。

那怎么去怎么去释放它呢?我们原来不去释放它是为了保证我们的提交提交和回滚是吧?在一个链接里,就上一个链接,我们做了一些数据,通过同样的连接,我们去提交它去回滚它。那么我们把连接释放掉之后。

没有连接可以依赖了。那我们依赖什么呀?我们就去依赖每个服务里面的undolog表。anddo log表能能明白啥意思吗?大家大家看一下啊,我我我给大家看代码的就知道这个这个东西是啥啥意思了。呃。

我在执行这个表的时候呢,我我我在这打个断点嘛,然后拿debug启动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等会我拿debug启动,在这打个断点,大家就能看到了。我在这里打一个断点,也就是程序执执行到这之后卡住了,卡住之后。调用库存服务是不是就执行完了?大家思考一下,调用库存服务是不是就已经有返回了?

这块能不能理解,就这个找错误去验证它的这个这个思路能不能理解啊,在这打一个断点,到时候直到执行到这卡住。然后这个服务是不是已经调用完了?能不能理解,给点给点反馈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是是吧?是是吧?好了,那我现在就来请求了啊,请求那就等断点卡着,请求一下。好了,断点卡在这里呢,大家看我的数据库。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后我们去库存表好了,这张表。好了,来看数据库里。这是我前几天做验证的这条数据不管,这是19号的不管。我们只来看这这条22号21。0嘛,这是现在的数据库。好了,我把这个东西复制出来,然后把我程序停了。

OK停了吧,别浪费我的精气心能在这耗着。好了,我把成员停了。然后我把这段我把这段给大家复制出来。😊,然后复制。编辑。怎么换行呢?看到换行给我说一声啊。回车。行了,不管了,无所谓了。我们来搜一下啊。

我们说befo大家可以看到一个看beimage。然后我们再搜after。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系列 6:P112:组合存储组件,分布式事务如何解决? - 马士兵学堂 - BV1RY4y1Q7DL

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

没事,这些东西不重要啊。然后看after image。视图自动换行是吧,视图。自动换啊啊。行吧,无所谓,语言人能选jason是吗?啊。啊,无所谓了啊,让他看一下就就知道了。那个。我不不那么费劲啊。

这不是重要的,重点是看这个beforeim好吧。After。in卖主要看这两个。好了,从这两个名字你们能看出什么什么什么东西来了。😊,能看出啥东西来了,那从这两个名字没关系,工具不用纠结啊,工具无所谓。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

里面有一个befo。有一个after。是不是在第一阶段,我把链接释放掉之后,我放心大胆的去释放。因为我那数据库已经存了,它从哪来的,befo之前是什么样子,after之后是什么样子,我都存下来了。

以后你要提交,要回滚,我这都有记录的,所以我把连接释放掉了。现在理解了吗?理解了是吧?okK这就是这就是西塔对连阶段性能的一个改进。好了。的,到此为止啊,对他把数数据放到了表里。对的,是这个样子的。

O不是不是呃,你说的这句话是对,你说的这句话是对,就是死糖。你这个话是对的。但是大家要记住,它是把全局global全局事物的分支事物的回滚信息放到了表里。并不是说数据库原来的那些日志信息放在表里啊。

能理解吧?这是全局事务分支事物的业务信息,业务的回滚记录放到了表里。是这么一个意思啊,并不是数据库自身的那个read do log and log,还有blog,并不是那些啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为你看啊,这里面其实涉及到一个框你要做框架开发的一个一个东西,就是你要做框架类的开发,就是你尽量的不要去改基础组件的一些机制。就是mycyclcle它本来什么机制,你不要改。

你只是基于它的上层去改动它。一般的做呃框架或者中间件的开发都是这样子。人家原来是什么样,几乎不改在上面做扩展OK。好啦。我看一下啊,现在给大家一分钟的时间提问啊,两次提交还要读出来再写吗?

那不会性能很低吗?什么叫两次提交还要读出来再写。这句话没懂啊,没懂,为什么要读出来呢?为什么要读出来?没我没有说读出来啊,回购前,如果有其他事误操作成功呢,如果这样如果有这种情况,那就算倒霉是吧?

那就算倒霉了。这个情况呢也会有处理方式。首先第一个。你的这些业务操作的,比如说update从1到2是吧?你一般的业务操作,这个只是这个业务把它从1到2。如果说其他的业务也把它从1到2。

那你说这个一这两个业务是不是要合并呢?你写两个代码,实现实现一样的sircle语句。首先在实际工程中,这种概率很低。所以你说的这个其他事物操作成功也不是那么大概率的存在。O这是一个问题。第二。

如果说你真有这些问题,那么自认倒霉人工补偿。只能这么做,但是人工补偿的概率也很少很少,几乎不会遇几乎不会遇到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

理解吧,刚才那个谁夕岩理解了吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示放掉以后。回滚的请求怎么找到这条记录,根据根据什么键然后然后嗯好了,这个问题啊,这个问题呢呃我在这里不做过多的解释,大家可以你仔细研究一下这张表结构叉D。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全局是5ID不nch IDD分支是5ID是吧?能确定。这样就能确定是哪个全局事务的,哪个分支事务。改的了吧,是吧你从这个表结构就能就能就能知道啊。Branch IDD叉ID圈接数ID分支数ID是吧?

这这这这个都有。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以这就这个不用担心他怎么查的,肯定是能查的。啊,第一次写入log,因为数据库连接释放了,连接上提交,不需要从underlog里面读之前的操作吗?之前的操作,我刚才就是刚才解释的也是你这个问题啊。

就是你从他这读。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这不就读出来了吗?OK你从他这读也就读出来了。😊,并且还有一个。如果提交的话,大家想一下啊,你想想这个影响性能,如果是提交,你该怎么做?直接把这个数据delete就行了嘛。把嗯把那个。

underdo log这条数据delete就行了吗?这不就完了。😡,な也ば。如果要回滚呢,那就把它回滚了。但是在现实工作中,99%是delete。所以很简单。只有10%可能呃1%要回滚,可能都不到。

可能是99点多少多少多少是吧?是delete,其他的是回滚,这个概率非常小。那你就话。如果服务是多个数据源怎么解决?多个数据源我这里面没有写代码和这个思路类似。ok。因为要再读一次话。

所以刚刚问性能会不会,所以刚刚问性能会不会下降。如果说读与不读来做对比的话,读性能肯定会下降。OK读与不读来对比肯定会下降。但是读也比占用连接占的资源要小。你把连接迟迟把着别人来用用不了。

至少你把连接释放掉,我现在来读一次又能又能咋地?孰轻孰重,我觉得你对比一下就能对比出来。理解了吗?这个叫啥小这个小孩儿小孩啊小孩儿。😊,明显了吧?哦,好了。😊,没想到你就长大了啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,这块可以过了吧。😊,这三个缺点我都说了。听到嘛?能过来就敲个一啊。嗯。我觉得我说的已经够够清楚了。所以涉报资的时候已经提交过了,这里面就不存在不需要回滚了。嗯那个。还需要加本地的售后助解吗?

这个啊HW华为,你下去自己试一下,就这种加的这个代码和不加这个代码的区别,你下去拿到我的代码自己去做。我现在告诉你,你下去也得做一遍,万一我告诉你的是错的呢。😡,能理解吧?

这种这种就是自己马上就能知道的东西,自己试一下啊。严炎是啥意思?我怎。😊,好了,这话可以了吧。😊,我们下一我们下一步了啊。下一步okK。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,下一步三阶段协交协议。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

O是吧?好了,三阶段提交协议有了前面的基础,三阶段会特别简单,课前休息吗?不休息。😊,好了,三阶段提交请就会特别简单。单阶段有有这么三个阶段看commit,等会拿着拿着笔过来。😊。

can commit pray commit or do commit三个阶段。为什么要有三阶段呢?大家想一下啊,它有这里面有,其实三阶段在实际中用的几乎是没有。但是他这个理论提出来呢。

也对二阶段有一个改善,就是对二阶段有一些改善,仅此而已改善。大家记住这个词啊,改善没有说全部解决二阶两阶段的问题,这是什么意思呢?😊,就说三阶段提交协议,你看啊和两阶段相比主要的区别在哪?

两阶段提交协议是啥?比如说这个这个猫嘛。😊,我说猫,你去给我干一件事儿去是吧?抓个老鼠去。😡,然后比如说咱俩是两阶段,我说你去给我抓老鼠去,然后你。😡,嗖一下就上房了是吧?开始抓老鼠去了是吧?

我说你去干,你就开始动了。😡,这是两阶段的第一阶段,然后你把老鼠抓来给我摁在爪子下,然后问我主人要不要吃是吧?我说吃是吧?这是提交是吧?这是两阶段。第一,你先去抓是吧?第二。

你回来等我的指令要不要吃是吧?这是两个阶段,这这块能清楚吗?好了,三阶段是啥呢?😊,就是你从两阶段来看,我说你去抓,然后你马上搜就跑了。然后三阶段是什么意思呢?就是说我说你去抓你不动。

你还在那你还在那猫着。😡,你脑子里想了一下,我该不该去抓这个老鼠,我能不能逮得到哦,可以,这个老鼠比较胖,跑得慢,我肯定能抓住,我给主人说一声,我能抓得住是吧?你不动,你知道吗?你不占有任何系统的资源。

你还在那待着。😡,是吧这叫要看肯命的,你先评估一下。是不是?然后你把你的评估给我反馈之后,我说你能做是吧?你能做,那你去吧,然后你嗖你才跑了是吧?这是这是三阶段的第二阶段,相当于两阶段的第一阶段。😡。

这有什么好处呢?就是说。😡,我能把那些。发生错误的情况,对资源的占用给他下降。这句话说的比较绕,能不能理解?就是说你本来抓不住老鼠是吧?你抓不住结果如果在两阶段的情况下,你搜上房了,结果没抓住回来了。

你浪费了。😡,系统的资源。如果是三阶段呢,你第一次说老鼠这个老鼠很瘦很强壮,跑的很快是吧?弹跳力特别好是吧?我就抓不住,然后呢,你呢你也不用动,你告我一声,你抓不住,拉倒,你又没有消耗任何能量。

浪没有浪费系统的任何资源。😡,能理能理解我说他俩的他俩的主要区别在哪了吗?能不能理解啊,猫喵。喵呢喵跑了。你已经执行第二阶段去了,完了。这孩子三阶段三阶段没学会就跑了。哎,又回来了是吗?抓了一下。

没抓着又回来了是吗?啊,理解理解就好啊,开个玩笑啊,不要介意啊。😊,怎么就知道抓不住呢?莫言,你还获诺贝尔奖了,你这你你自己想想怎么就知道抓不住,他看老鼠比较瘦,老鼠弹跳率还比较好,距离还比较远。

猫杆吃饱是吧?如果回到我们系统中,举个例子update一条数据,比如说叫flagflag只能是0或者一是吧?这个记录或者说叫if deletete这个字段。我举个例子啊。

只能是零或者一一是删除零是不删除这个字段只能是这俩,结果你来一个请求,说给我把它干成3。😊,我能不能知道我能不能把它改成3?当然不能了,它只能改成零和一,不能改成3,我就说改改不了。😊,理解了吧?

这只是举一个例子啊,我觉得从这个例子上来说,你应该懂了吧啊,莫言。😡,谁来管理这个谁里库自己去管理。可以结合订单模结合订单模块呢,订单模块if这个订单是否删除。

就是订单表里有一个字段叫if deleteelete,这也可以啊。这样可以吗?是吧。就是先校验一下。对,就是先校验一下。OK这个校验一下,比你去执行业务逻辑占用的资源要少的多。明白吗?

又不是真去改别upate,直接upate一条语句下去了,结果出错了,又回来,是不是这这就这就没必要了。就是从资源的利用率来说,就是对资源的耗费上来说,校验肯定比实际去做耗费的资源要少。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你入话。这个需要资金简代码这样吗?一般不用这个不用,这个不需要。这个一般都是框架给它分装,框架给你分装好的。如果让你自己去写这种这种教验的话,累死了,累死了。OK还要给大家说一点啊。

不管两阶段不管两阶段还是三阶段,就大家觉得很复杂,就这些东西很复杂。什么第一阶段等着等着响应,等着同意,然后等着no,等着超时,考虑各种各样的情况很复杂,因让我把它实现的太复杂了。

大家大家要想一个问题啊,在我们做软件。在我们做软件开发的过程中,你想到很多很复杂的中间件或者组件的原理是吧?这些东西做起来特别复杂,你不用担心越复杂的东西,越有人给你分装好了,让你直接用所以不需要担心。

😊,知道吧?活人还能被不得翠配传到桥头自然值,对吧?就这意思。当你要用的时候,你要实现两阶段,我怎么做怎么做?好了,阿里巴巴给你提供了一个sta,引用一个价包写一行注解搞定。对。

就是这个人说的program对吧?就几行配置而已,所以不要担心啊。好了,这块可以过了吧。😊,但是面试官会问,所以我才给你讲的这一个半小时呀,就因为面试官会问我才给你讲了这一个半小时嘛啊,懂了吗?喵有?

😡,我跟你讲了这么多长时间,是是让你们干嘛的,是吧?如果说讲讲它的使用,引入一个架包,引入一个写一个注解,你你就会用了,是不是?讲了那么多,不就是为了让你理解原理是吧?跟面试官聊嘛。

然后抓抓老鼠的时候先评估一下再去抓嘛,是吧?提高一下自己系统系统的性能啊。😊,好了,三阶段主要的就在这里啊,我们我们下一步啊,下一步三阶段呢我把我只说里面主要的这个第一三阶段的第一阶段看commit。

刚才我说过了,评估这个很简单,是吧检查。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

检查circleOK这个评估是怎么做到的?能简单聊聊吗?跟他聊过了呀,莫言。😊,我K刚他聊过了,刚才我已经给你举个例子了,if服delete已经给你举个例子了。😊,好了,第一阶段检查circle往下走。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后在第一阶段。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是吧都返回yes的时候,就是第一阶段都没问题的时候,我们再执行第二阶段PRE commitit好了。第二阶段呢就是我们刚才所说的两阶段的第一阶段,这个也很好理解是吧?这个就快速过一遍这个动画。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,然后这个完了。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后第第一阶段。有这么三种情况,就是有一个参与者返回no协调者等待超时,参与者没有收到协调者的指令。OK这里面多了一个参与者没收到协调者指令,所以他执行。upshop这里面是放弃提交。理解吧。

这块这三个挑战单从字面意s大家能看出来这三个挑战啥意思吗?😊,能不能理解?能看看的看的看的清楚吗?啊。清楚是吧?清楚就不不做过多的解释啊。因为这个前面两阶段已经讲了很多,放弃就好了,放弃直接回滚。

利用本地的数据库进行回滚OK。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后这个快速过一遍,因为前面脸阶段说这话说的比较多,好了。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PRE阶段执行的都是yes,那么执行do commit这个也简单是吧?do commit执行完了就拉倒了是吧?执行事务释放资源好了,这是do commit。然后呢我们往下走。完成事务。

那么第二阶段发生这种异常,就有一个参照访问no或者协调者等待超时,我们发送absorcomit。就是说有这两种情况的时候,我们发送放弃提交,也就是类似于回滚。okK好吧。

这就是absor commitit,这也很简单,这个回滚一下,无所谓了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,这个动画走完,我们来看几个关键的地方。超时机制的设置。好了,这里面有超时机制,一个是协调者,后面还有参与者。大家可以比较一下两阶段和三阶段他对。性能的一个优化在哪里?

就是说你看啊两阶段在第一阶段发出请求是吧?你去执行去。此时这个服务呢占用了连接,一直占着第二阶段。他第三方要给他发请求,如果请求没来,他就一直等着。

是吧就像可可托海的牧羊人一直在那等着那个等着那个养蜂女的归来,他就一直等着死脑子,一直等着。那么他一直等是不是就占用资源了?😊,一直等是不是就占一直占用着资源,他不懂得超时,等不到了还在等。

所以资源一直在占用。那么三阶段对他做了优化呢,就是说有超时机制,不仅协调者有参与者,也有参与者。在后面我说。这块理解吧?所以说就是等不到了,我释放了。😡,是吧释怀了,你爱来不来,我不用了。

讨论讨论什么月月呢是吧?快点,这块懂了吗?别我在这商量。说呢你还真的在在想莫言和养光女呢,你还想你的月月呢?月月丢了对,月月丢了就别找了,回来是吧,回来接着上课。😊,是吧丢了一个月月。

还有无数个月月在等着你是吧?比如说好多好了,能理解这个超时设置超时的目的吧?你听着呢是吧?好了好了,这是超时的目的啊。PRE commitit超时之后。行调准超市之后,发送回滚的指令。

然后do meet之后发送回滚的指令。节奏快点,时间不多了,刚才让重复讲的也是你时间不够的,也是你放心,时间再不够也给你讲完了。啊,肯定给你讲完是吧,讲不完你别走。到。好了,这这这只超时机制。

协调者超时之后,两个阶段发送的都是回滚的指令。那么大家来思考一下参与者呢。参与者在第二阶段超时就是收不到第三方给我的指令。在第二阶段。我该怎么做?我是放弃还是提交absor,还是接着往下走?

在第二阶段就说我说喵,你去抓老鼠吧,你喵说好。然后呢,第二阶段。你要等不到,我给他说去抓老鼠这个指令。😡,那你说喵该去抓还是不该去抓,放弃,好多人都说放弃是吧?那么喵肯定放弃嘛?是吧?

我说主任我能抓到老鼠,结果主人没告诉我去抓,那我就不抓好了。😡,是吧。好啊,再是回滚。结果呢你看啊到第三阶段的时候,我说喵,你去抓老鼠吗?喵说好,我能抓。然后我说那你去吧,然后喵嗖一下上房了,去了。

那么第三阶段喵抓回了老鼠之后放在我面前了,结果我我走神了,我我我在想回答莫言的问题呢,结果喵不知道我我让他吃还是不让它吃。那你说这只猫老鼠都抓到手里了,它吃还是不吃。😡,是要放走还是吃了他?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

系列 6:P113:TCC(Try Confirm Cancel)解决方案 - 马士兵学堂 - BV1RY4y1Q7DL

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

吃呀是吧吃是吧,那就是。那就提交嘛,对吧,小强是吧,吃。是吧当然得吃了。因为对猫来说,第一主人问我能不能抓,我我说能抓,然后主人让我去抓,结果我也抓回来,也把老鼠摁死在这了。

然后主人又不让我吃我对这个主人有多失望,所以为了表示我对主人的信赖,我把它提交了。😡,是吧因为因为大概率主人让我吃,不然他让我抓他干啥呀?😡,我只是说大概率。啊,没有说绝对的啊。

万一主人就是让我抓来玩一玩,看一看老鼠长啥样子。是吧大概率让他吃,所以他提交记住这块啊,就第一阶段成功,第二阶段。业成功。第三阶段大概率是让我提交的。ok k。如果出现这种张数据,是我们的脚本来检验吗?

是的。是的啊是的。好了,这话能理解吧?大概率大概率大概率。好了,这个我总结一下啊,如果说用两阶段。这种强一致性的事物。没有人能做到百分之百的保证。数据与直线这个C。数据执行。

没有人能百分之百的保证数据执行。ok。我说的清楚了吗?所以只能大概率降低发生脏数据的。情况就是只能降低发生脏数据的概率,但是不能百分之百的保证。O可以了吗。老师三阶段怎么做?三阶段我跟他说了。

百分之市面上99%呢不用。😊,两只段已经够了。第二阶段PRE执行超时收回收到回文指令。回滚指令有没有可能比之前的PI指令相知,那回滚就不白,那回滚不就白回滚了。好了,这个同学说的这些问题呢?呃。

是属于一些异常的情况。这个呢有这么几种情况叫空回滚,叫密档,还有叫悬挂。这个里面的各种异常情况很多,但是这个东西呢我要给你解释清楚呢。耗时很长。所以在这个课里呢不解释这些东西啊。

这些东西在我们VIP课里有在我们VIP课里有这个解释,就是各种异常情况的解释ok。因为公开课我只能把一些核心的观念告诉大家,因为就只有两个多小时是吧?要么3个小时。

我在VIP这个东西我上了20个小时的课。所以不能面面俱到是吧?公开课就so say sorry了啊,对大家。好了,可以理解了吧,这块。😊,能不能理解啊,啥啥情况?咋了?伤心了,你也不是VIP课。

听不着伤心了。不要伤心。是吧毕竟VIP跟非VIP还是有区别的嘛。是不是要不然你让我们那些交了钱的VIP情何以堪?没事,不理解我们报VIP是吧?老师剩下的时间管告了吗?我能理解,如果我想复习份资料。😊。

没课还没讲完呢,管啥告呢?别着急啊,你咋这么想听广告呢?你要想听广告,我就给你说说广告。😡,好啊。Okay。别哭别哭,课还没讲完呢啊。好了,往下走啊,你要想听课多着呢。😊。

老师VIP的课在哪个包里面呢嗯。找班主任找你的班主任去,课证名叫啥?来来来来来来来,等会儿我我。耽误30秒的时间,我让这哥们看一下客栈哪啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

客栈哪?等会啊,这30秒啊别走,不是广告啊,他说不是广告啊,只是给我们VIP找一下课啊。😊,在网原车三板里。然后这个。分是5从2十一节课开始,一直到20到3030节课。一共时间每节2小时自己去找去啊。

找你的班主任去要我在这里面都讲过了。OK好了。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是吧,go ahead。好了,说着下一个说TCC。现在还有多少人在听课,敲个一。嗯。都在是吧。🤧嗯。哦,都在啊,这移动联通天翼也来了。对对他啊吧,感觉白了头的。啊,猫还在啊猫还在就行。好好好好好。

带着好带着继续讲啊。好了,来继续讲听CC。😊,TCC什么意思?如果学过前面的两阶段,那么你理解TCC就方便多了。从名字上好好看一下,try confirmc中间加一个O,这俩是一伙的,这俩是一伙的。

明白了吗?现在能不能明白,能认识这这这这这仨单词的意思吧?第一阶段。拜一下是一下。如果没问题,第二阶段confirm。如果有问题,第二阶段cancel好了,PCC说完了。听楚了吗?

为什么前面花那么花那么长时间给你讲两阶段是吧?学完两阶段,你再理解TCC这不很很容易吗?😊,为什么要有TCC?😡,大家想过这个问题吗?为什么有脸阶段了还有TCC?😡,想过这个问题吗?讲得好,鼓掌。

谢谢啊。好了,想过这个问题吗?😊,提高性能TC在太差。哎,这。这这有什么性能提升呢?虽然说也有一些性能提升的考虑啊,首先第一步try它是落库的,就类似于C塔的那个操作方式一样,是落库的。性能是有所提升。

但是最主要的原因是这个。你在你的方法里。调用了that KV。调用了up date circle。ok。所以用这个,如果你用前面的连接段,那个的话,你能保证他和他。在一个事物里吗?

能保证readninginess和my circlecle在一个事物里吗?能不能保证?能不能保证快点的?Quly, quietly。能不能往证想想。不能是吧不能保证是吧,都不能保证okK那不就得了。

有TCC来了,明白了是吧?OK我就喜欢这样的这样的学那个。😊,那个这样的朋友啊,一说就一说就懂。系话,好啦。明白了是吧?好了,明白就好,其他的我去。😊,这什么?来其就是明白的同学敲一。不明白的同学敲2。

明白的敲一不明白的敲2,有不明白的啊。嗯。为爱活着了,只为爱活着。小迪。我去怎么二变多了呢?😡,明天会更好。怎么二还边,我操,怎么哎呀,我去。这这啥又是小强,又是老孙的,又是猴子,又是啥呢?

好了好了好了,那不明白没关系啊,给你解释清楚就好了。好了,这个二太多了啊,都都都都2好了。😊,喂。😊,嗯,对不起啊,刚才有口误的地方,大家不要介意啊。好了,我举一个例子,你就明白了。好了,现在。😊。

现在我们做一个业务,这个业务上呢,张三给李四转账转100块钱,明白了吧?张三给李四转转100。ok。待阶段怎么做?出外阶段啊。踹阶段。张三的余额钱包表里有这么两个字段,一个叫余额字段,一个叫冻结字段。

踹阶段就是张三的余额表里减100。冻结字段加100能理解是啥意思不?来这块刚才敲二的同学能理解的话,你现在敲个一。😡,是吧超了相对先理解这一点啊。小强懂了是吧?我知道小强乔二了啊。😊,嗯,好了。

明天更好,我知道你也敲二了啊。好了,喵,你刚才敲的是问号。😊,是吧这是你刚才抄的,你也抄到了,好了好了。😊,这话能懂是吧?比较快要试一下。然后李四呢冻结字段加100,你可以看到整个系统中全在尝试。

并没有说李四的余额加了100,只是余李四的冻结字段你先加了100是吧?先做一个缓冲,先大家先试一下嘛,能不能成。是吧就像你跟你你偷你女朋友钱出来花一样。你们俩抽屉里。一共有1000块钱。举个例子啊。

你要偷100块钱出来花,你胆子够我大吗?😡,是吧如果胆子不够大,先拿出100是吧?先到抽屉里是吧?放冰箱里。是吧先放冰箱里先不花,万一女朋友发现了,说哎,怎么放冰箱里了是吧,再把这钱还回去。

万一女朋友过了半年了也没发现。然后你从冰箱里把这100块钱拿着出去花了。😊,是吧这不就神不知鬼不觉吗?所以这个道理一样,先把这个钱拿出来,放冻结字段里先待一会儿。😡,如果说整个系统都没有发现。

都没有出错的话,那再把它花了,这只要踹,先去踹一下。好了,这个应该好理解了啊。好了,如果说前面没有任何问题,那么执行的是。conform。是吧就是什么张三从冰箱里把钱拿走,花掉。是吧这次彻底花了。

钱没了,女朋友有没有发现?😡,是吧然后李四呢是吧,也也大大方方的接受了。😊,是吧张三媳妇没有发现,然后李四是吧,冻结这段把刚才那100减掉,余额加了皆大欢喜。明白了吧?这叫conform确认是吧?

如果在踹阶段被媳妇发现了呢?很简单吗?还回去吗?是吧从哪少的放哪去,从抽屉里捡了100,给他加回去,冰箱里多了100给他减回去。你是呢冰箱里原来多了100,也给他还回去是吧?世界恢复平静,白干一场。

明显了吗?那里是的余额加100的时候,系统出错了,咋办?哎,一问如果李四的余额加100系统出错,那就把你媳妇抬出来,让你媳妇来解决是吧?也就叫人工补偿,大不了你挨一顿是吧?要么潜滚,要么李四就加100。

张三打一顿是吧?要么李四少100给张三退回去,要么这就叫系统里叫要么叫潜滚,要么叫回滚,反正就就就这这么这么个意思。李四为什么要冻结?😡,好吧,那我我这么给你解释啊,这个灶看来你没投过钱,我跟你说。

来往回走。😊,往往往回走啊。如果李四不冻结,你现想会遇到一个什么情况?举个例子,张三余额减100,李四不冻结,李四的余额直接加100。是吧这是李四余额里加100。OK然后还在踹阶段。

然后张三被媳妇发现了,偷钱了。然后李四一看他的余额,我去,我的余额怎么加100,李四把他的媳妇叫过来了,说媳妇,你看我多了100块钱。😊,结果张三被媳妇张三事发,然后媳妇说你把钱给我要回来。

结果张三把钱恢复了。那么李四加了这100是不是也得减回去?😊,然后李四的10元减回去了,然后张三莫名其妙媳妇说你骗我。你玩我。是吧然后炒一下再打一顿,李斯是不是白白的瘦了?受这么个罪。

是吧所以冻结一下嘛,缓冲一下嘛,不就完了。明白吧?从用户体验上来说。😡,你不要让你的用户有这种大喜大悲的情绪。怎么我卡里多了这么多钱呢,忽然间花一下又没了。😡,是吧多尴尬,所以缓冲一下嘛。

从用户体验的角度来说这个事啊。好了,现在理解了吧,给你解释清楚了吧?你是不动也不加呢,那你这个业务干啥呢?😡,两个人两个人通过心灵感应就做了数据传输。是吧没必要嘛。是吧好了,这个过了啊。😊,好了。

这个可以过了吗?能不能过了,快点,能过敲一,刚才超二的那那那帮人。难过了吗?哦,这就对了嘛,是吧?节奏得得带好,是不是?好了,往下走啊。然后下一步。下一个方案。消息队列加本地事件表加定时任务。

OK从这个从我PPT上列的这这一行字里,大家应该明白。我所用的技术就是这些技术,没别的了是吧,也不用中间键,也不用第三方就这么搞。然后再来看这张图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我把大家都挪走了啊,先挪走看这张图能看明白吗?😊,能不能看明白?把它挪到这儿吧。能不能看明白?是吧刚才我说了不能看明白。鬼谷子也不懂啊,鬼谷子,你不是智慧的化身吗?你也不懂。😡,刘能也不懂。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不懂啊,不懂,那再看一张图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,我这张图懂了吗?刚才刘南跟鬼谷子,你俩应该是西安区啊,你俩应该懂啊。啊,东北F4。啊,鬼谷子懂了嗯,鬼谷子懂了,果然是鬼谷子。辽达吗?我能哥呢?赵本章不让你拍戏之后,你你你也不懂了,是吗?

这个刘能还换了个外国名字,赵四有个外国名字叫。尼古拉要亚洲武王尼古拉斯赵四啊,现在懂了吗?啊?其他人懂了吗?能懂的给老师敲个一。通过流程明白了是吧,刚才又也是流程啊,刚才也是流程懂了是吧?

我工作就是用的这个是吧,你敲代码敲的挺好的。懂了吗?啊,还用还用还用说吗?只为爱活着。也懂了是吧?你看前面好好听课的都懂了。唉C一个懂,哎呦,我去都懂了。好了,懂了,那就过了,不讲了啊,可以过吗?😊。

不可以,我操。讲一下小强讲一下啊,小强还小是吧?照顾一下,你看这个猫,我跟你说,这个猫每次都打问号,别过。😊,哎,不要是吧,不要过好了好了,来说一下啊,画几个圈。😊,先看大圈。这两个这是什么什么颜色的?

咖啡色吧,这两个咖啡色的圈。来看这两个咖啡色的圈。是两个服务。这是俩服务O。机长,这是两个服务。好了,我删掉。这个用户的请求进来,这是用户发起请求进来。第一步执行业务逻辑。第二步,插入事件表。

第三步给用户一个响应,OK用户干的事就这么多。嚟。从这个流程里大家看到执行业务的circle和插入事件表的circle。是一个事物吗?是是吧,这是一个单机的事误是吧?所以能保证是吧?

加个at second注解OK没问题。好了,这步过了啊,第二步读取事件表里未处理的未发送的事件,然后把它发送到消息队列,然后回来发送成功更新状态以后就不读它了。OK这也在一个事物里。能不能。

理解还在一个事物里。是吧可以吧?okK好,一敲起来了啊。好了,再往再往下走。3。😊,这边有一个服务去监听这个队列。监听完之后,监听到一个消息,把消息插入到这个表里。插入成功。

然后给消息队列一个响应ACK1个响应。OK点完协议之后,以后就再也收不到这个消息了。也说这个消息我平安的把它从这放到了这,我以后就不管了。可这块可以理解吧?能不能理解能理解是吧?OK好了。😊。

那个事件到这之后,那么就执行他的业务呗,把事件取出来,该执行你的circle,该操作的操作,该更新更新,这又在一个事务里。老师ACK如何执行呢?这是MQ自带的。MQ自带的是吧,rocket MQ呃。

rocket MQ有activeMQ也有这后队队都有都有SCK都有SK。你可以你要用过的话,你可以知道。😊,OK好了,一般的发送失败尝试,比如说roingMQ16次。如果没有记错的话。

就是这个消息发16次。如果16次都接受失败的话,进入死信队列就呆的量。那个死性对列死性对列它也是一个对列,你还可以去监听,监听到死性对列之后人工处理。就OK了吗。理解了吧?其实他的整体思想就是把一个。

大的跨服务的事物把它拆掉,拆成小的每个服务的事物。现在理解了吧。是吧积少成多。今夜陈裘。什么,还有什么,反正就这个意思。😡,能能来这块能懂的给老师敲个一。手机砸脸了,那啥呀?这个会有时效性问题吗?会的。

会有时效性问题的。是吧这叫b斯理论。保证了最终一致性,但是牺牲了时效性。好了,那么它新生的时效性,它有什么优点呢?它的优点是。性能提升了,仔细仔细琢磨一下这句话。性能提升了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

考虑一下为什么性能提升了。

系列 6:P114:消息队列+本地事件表+定时任务方案 - 马士兵学堂 - BV1RY4y1Q7DL

这个服务比如说要花10秒钟处理时间,这个服务也要花10秒钟处理时间。我这个用户调用完这个服务,再调用完这个服务,一共需要20秒。但是我用这个方案。我10秒就能返回,我只需要10秒。

是不是用户的平均响应时间降低了?是不是平均显示时间降低,那就是我能接受的用户的请求就更多了。你又嘛。能不能理解有好处也有坏处吗?是不是一个是在同一个服务吗?是啊,是在同一个服务。第二个服务失败了。

第一个服务怎么回滚,不回滚。记住我说的话,这个时候就不回滚,怎么回滚呀啊,为什么我都给你解偶了,你还要我好不容易把这俩这俩在一块打架,我把他俩拆开了,你还让他俩再打回去。😡,这个时候不回滚。不回滚。

你错了,就一直消费一直消费一直消费消费到此。😡,他进入死金对量人工补偿。那你入啊。这个就是只能前进,不能后退。你有啊。嗯。😊,这个处理方案叫啥呀?这个处理方案叫且听分盈,分布式事物解决方案。好了。

如果没有名字,拿你命名。且听叫QT风win银上。是吧QTWS级的方案好了,不用纠结名字。好啦。明嘢了吗。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个方案的名字呢叫这个。消息对待加本地时件表加定时任务解决方案,是吧?名字太长。那第二个一直不成功不就不一致了吗?第二个一直不成功,叫bug。能理解吗?叫bug大写的BU goBUG bugg。

自己去改代码去。你又话。刚才的新宇呢,新宇还在吗?好吧,这么不情愿的应个好吧,就是bug自己改去。好啦。好吧,这这是这种解决方案啊。😊,好了,我们再往后走,再讲一个解决方案。

rocket MQ事物消息解决方案,直接看图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看这个图的话。来能不能看得懂?看看代码吧,这个那个还需要看代码吗?就是本地数据库加I。来这个图仔细看1到81到8,从顺序开始往后看,1到8。先自己先看一眼啊,我就不念了。看完之后,难懂的敲一。Yeah。

为爱活着,你懂了?我的天。啊,团团也懂了。没事,不懂的把疑问打出来。😡,不懂得把疑问打出来,因为项目用的就是这个哦。好了,那那那那正好讲对了,但是我不知道ACKACK的话小毁对列。😊,呃,你哎消息队列。

那你看消息看我们消息队列的课吧,这些消息队列的基本操作呀。😊,消息框盖住了,没关系,我挪一挪。我挪一挪好吧。攞一攞可啦吗。先看着嘛,几秒钟啊,让我喝口水。啊,嗯。

本地上是不知道不知道我如何执行ACK插入成功之后,不知道如何ACK。这样吧,你加我们的右下角的二维码,加完之后。我给你找找啊,我原来写过这些代码,我给你找找我们VIP里都有都有这些代码。啊,好了。

这个这个这个东西我简单过一遍啊。第一步发送一个half message。这个half message其实这个方案里面最关键的就是half message。发完hal message之后。

后面的食物是后面的服务是无法消费。h message,就是它是一条消息发到消费堆里,消费对的消息消费不了他,等他把他的事务执行完,然后再给他发一个提交h message,他才能消费。这样这样理解了吧。

这样的话就把消息和这边对数据库的操作绑定在了一起。也就是执行业务和发送消息是一个原子的操作。知道这个方案里面的目的是啥了吗?有消息队列的基础吗?这个需要有消息队列的基础。如果没有这个基础的话。

这个课这个我这么说,估计你也不好懂。来,能理解我说的这个关键点在哪了吗?能理解是吧?okK好了,为了保证它的原子性,还给它有。兜底的方案也有兜底的方案。兜底方案是啥呢?是这个你看啊一条消息。

我发送给消息队列了,就是have message到了。但是呢第四在路上丢了。也就是说这个消息存在于消息队容,迟迟的我不知道他该怎么办,我怎么给它兜底,兜底就是第五步,未收到四步骤的命令,我去回查查一下。

检查一下本地数据库的执行状态。如果。数据库执行的没有问题,那么我就提交。如果数据库执行的有问题,那我就回滚,把have message直接干掉。ok。理白了吧?这是第一步保证它的原子性。

如果说第其实原子性就出问题,出在第四步上。如果第四步出问题,我再兜个底。是吧planlan B。OK现在清楚了吧,您说。😊,Ccle业务的执行。和消息的发送是原子的操作。rapitM好友没。

现在只有rocketMQ有啊,我了解的只有rocketMQ有是我消息。嗯。明有吧?对,第七步很关键,听鬼谷子的鬼谷子说什么关键,什么就关键。啊。可以理解了吧,电话。🤧嗯。能不能理解这块?怎么没人了?

你要不理解的话,你把问题打上来,我给你解答O。😊,这个有意思,把消息和数据绑一起。对的,卡不卡能动吗?卡不卡不能做。half message讲讲half message记住就好了。

half message不能收费。b message其实就是一个一个消息进入到你看啊,就是它里面比如说用它里面有一个队列,队列存储了一个消息,这一行消息,消息里面一个标记,有一个flag。

如果flag是一,能让它消费。如果flag是零,它就叫半消息,这不就这不就得了。是吧就是消息在MQ里的一个标记,我标记你能消费,你就能消费。我标记你不能消费,你就是个慢消息。仅此而已。好吧,是现在选率。

然后消息队列的这些东西呢,你可以扫描这个二维码,找我们的咨询老师给你要一些我们消息队列的公开课都可以的啊。😊,消息没有提交,只是存在MQ里面啥意思?不不不不这是这个意思啊,就是说消息呢都是都是一堆消息。

不过是消息里面有一些状态是不一样的,是一,我就能让消费者消费,是零,我就不让他消费。我提交就是把一把零变成一,我回滚就是把它干掉。就这么简单。第五步怎么做的?第五步怎么做的话,如果你用呃用roMQ的话。

它有。它有一个loc localal transaction,有一个方法就是你实现它的一个接口,那个接口自动会让你实现这个方法。这个方法呢就是做回查用的。这个这个很简单,你要你要用它的售物消息。

它就它就会有这个好了,这里面其实有一个关键点啊,这里面有一个小技巧,就是这个你们一直纠纠结在第五步啊,第五步里面有一个小技巧,我估计你问的也是这个啊包子。😊,好了,就是你看啊。

我执行我的业务的circle是吧?业务的circle我该干嘛干嘛。这这是业务的 circle口。同时。我插入一个事件表,就是一个事件的表。然后这俩C口呢在一个库里。就是在一个库里。OK这是不是一个事物?

先理解一下这个这是不是一个事物。包着。还在吗?嗯。啥情况?负JC了,是是就禁止了。不理解这个是不是一个失误。我跟你说,你们要不不回答,我不讲了。😡,是是吧,那你回查的时候。😡,回一查第五步的时候。

查这个事务表不就OK了。是吧不用,虽然你的业务可能操作了10张表,我没必要把时间表查一遍嘛,我只查这张表里的一行记录就OK了。理解了吧,所以回查也很简单。最怕空气突然安静,真是的,这个安静。理解了是吧?

OK好了,这就是里面的一个小技巧啊,也就可以了嘛。😊,是不是?Yeah。好了,可以过了吗?这个。😡,嗯。如果执行到第四步,程序挂掉了,还能回查吗?当然可以了,回查可以重试,就是回查这块可以重试的啊。

可以重试,就第一次没查出结果,过一段时间再重试。ok嘅。过是吧。好吧,过往下了啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好了,我们还差最后一种方案叫最大努力通知方案。好了,那现在为止已经讲了整整两个小时了。😊,然后呢。今天是我们那个呃昨天活动的一次返场,然后我想把今天的就是打个广告晃换脑子,然后过20分钟。

我们再开始讲我们最大努力通知方案,可以吧?先歇一歇啊,我讲的口干舌燥。可有吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以是吧?是吧?谢谢大家理解啊,好了。😊,嗯,给大家看一下PPT。然后。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

说一下我们的服务。这边就是我们你就是买我们的课程呢,可以享受到我们我屏幕上的这么多服务。第一是我们的课程内容对标互联网公司的技术站,就是跟呃现在主流的大厂原来的技术是对应的。

甚至比一些呃大厂还要更超前一些。啊,就是就是说大厂计划在用还没用的技术,我们的课程里也有了。OK好了,我讲一下啊,就第一部分我们的课程内容,课程内容有哪些?我们一这8个东西我们一个月来讲。

预计20分钟就讲完了。课程内容我们有哪些。大家可以看一下我们的课程大纲,就刚才在找那个。😊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

呃,找那个分布式事物的时候,我给大家已经看过一眼了。大家可以看一下,我把这个课程大纲收起来。然后你可以把我们的课程档纲缩缩小。看一下我们科程大杆的整体。看一下这是什么东西。

这是我们MCjava后端架构师最新版的一个课程大纲。然后这个课程大纲按什么来组织的呢?按技术项目面试,还有一些不定期新增的内容。OK就是我们我们学课程主要学技术嘛,但是学完技术呢,我们得得有实践是吧?

技术是为业务服务的,得有通过业务去把技术实践一遍。然后这是项目然后学完技术和项目呢,大家都是为了跳槽或者涨薪嘛,是吧?如果说在企业内部涨薪的话,你需要晋升是吧?需要答辩这也相当于一次面试,是不是?

然后如果说你要跳槽的话,这更相当于一次面试了,我们会有。针对短期的跳槽,还有长期的提升,我们都有相应的课程给大家进行辅导,包括简历辅导、职业规划,还有面试突击班。ok这是面试的东西。新增的东西呢。

这包括我们的一些呃比如说新技术,我们会我们会在这里面新增。当然这个内容是不定期新增的。比如说最近的云原生,还有呃大厂bug的处理专题,就是说在大厂里面遇到什遇到什么样的线上的事故。然后怎么对它进行定位。

怎么对它进行解决,这个在我们的课程里都有。还有就是京东618阿里双十一大规模的促销系统,呃,怎么设计的。然后我们也有,还有就是。团队团队的管理课就是技术管理课,团队怎么管理DDD怎么用是吧?

AI然后产品课就是做一个技术人员呢,你也需要懂一些产品的知识,尤其是你以后如果说你的这辈子的目标是当一个高级开发工程师,到此为止,那就啥也不说了。你只会前面的技术就OK了。但是如果说你有更高的追求。

想当一个呃架构师或者说一个技术经理这种岗位的话,或者说更高技术总监技术副总裁你想当这些的话是吧?如果说再远大一些当个CEO是吧?产品的知识,你必须得会是吧?还有原来有句话嘛,产品经理是CEO的摇篮是吧?

就是说你想呃在技术上有一个高维度的突破,产品的知识,你是必须得掌握了。OK这就是我们大的内容。好了,我们来看一下小的内容。技术里面我们有哪些技术呢我们分2块,一块是P6,一块是P7。😊。

我们为什么这里面没有说P8呢?大家知道我们原来有课程的有P8,但是我们我们其实P8和P7,大家知道他们技术上的差别在哪里。大家知道P8和P10基本上的差别在哪里吗?有没有人知道?管理吧。对,就是这个。

其实他们的技术几乎没有什么没有什么质的差别,技术就那么多是吧?差不多就是他能不能带着团队能不能开拓新的业务,能不能调配资源,主要主要就这些了。😡,OK好了,我们那我们来看一下P6和P7需要掌握哪些知识。

P6打开从前往后前置知识。大家可以看一下P6的前置知识其实就相当于一个P5的要求是吧?你需要掌握一些基本的开发工具,将SE你得会然后SSM框架,你得会spring boot,你得会,然后再做一个小项目。

这就是一个P5的水平,前置知识就这么点是吧?P5的水平是一个什么样的水平呢?就是大学刚毕业,不管你是本科生还是研究生,刚毕业,如果你要去大厂,那就是P5是吧?阿里是P5其他的公司呢可能是T是吧?

这个就不说了。我们以阿里为例来说好,这是需要掌握的前置知识,然后。讲问完之后,这个应学院要求新增的这些课呢,这个是我们就是我们学生要求我们实时更新的这些课是吧?

快速上手二手项目怎么重构公司的项目等等等等。这节课是我们临时新加的,就是我们学生,比如说迫切需要什么课,我们也会加到我们这个里面。还有往下走第一个底层知识。大家可以看一下操作系统网络IO呃。

网络min的运维算法是吧?这个是底层需要掌握的知识。第二个并发编程并发编程是吧,需要了解操作系统对并发的知识阻塞队列GUCGMH等等等等这些东西,现征池这些东西你得了解,然后把它说起来。

然后第三RPC通信框架是吧?如那会遇到一些呃第三方协调者是吧?用keeper呀,是d doubleou呀,它也是用的W系统RPC调源方式嘛是吧?resres。规范是吧,ntynty长件也是IPC用是吧?

IRPCremoteproc call是吧?反正是你要调用别的系统,就叫IPC。😊,好了,往下呢前置知识也会讲吗?都会讲的,放心,这里面列的我们都会讲,只要是我们这个大纲里列的,都会讲到。😊,好了。

前置知识不是说你需要你需要先具备这个再学,再来学我们的课,不是这样的,就是你啥也不会,你先学先学前置知识,我们都有对应的课程,就是我们java追学班的课程都有okK好了,然后消遇中间键。

比如说actMQraitMQ卡普卡和rockyMQ这四个消语队列。😊,这四个消息中间键是吧?HDMQ太老了,这是我小时候用的不用了是吧?raidMQ用的少不用了是吧?所以只剩下卡夫卡和rocketMQ。

而我们今天所说的事物消费呢,只有rocketMQ有是吧?所以你知道你该选哪个了吗?这个这个。😊,ok。还有最新出的这个。这个都可以都可以学一学。好了,这是消息中间消息中间键,然后收起来。第五。

缓存中间键reis my catch。等等,就是一用到一些缓存。好了,往下走。然后软件软件设计的基础是吧?UML设计模式、敏捷开发等等等等这些东西。第七,分布式架构的实践。

这个里面啪一堆全是分布式的一些解决方案。是吧分布式锁分布数缓存存储分布式ID分布任命的分布式任务分布式绘画等等。这是第七。第八,微服务架构实践。

这里面有配置中心、注册中心、网络路由服务调用、负载均衡熔断间极限流隔离。奈菲阿里巴巴这两套我们都讲好了。第九系统的性能优化GOM优化,mysl优化tome head n等等一堆优化。第十。

海量数据的存储。是吧ES click个 housemy circle,no circle,这里面都有。然后数据的搜索。Loss了ESEOK。排量数据的处理。ha do map reduce。

然后flink等等等等。have这里面都有好了,再往下走。网络运维的基础是吧?多机房的问题,伊利多活的问题,联地三中心的问题。怎么怎么解决,这里面都有dalops的东西,开发运维一体化。

开发运维不分家是吧?这都需要会。然后测试的东西。OK就是写完代码,你怎么去测试是吧?这个我里面我们都有。然后不过网格的东西,这里面我们也有。

我们用int still去做去做的古网格int still也是古网格呃,现在落地比较广的以比较成熟的一个方案啊,这是P6。OK好了,P6说完,然后P7。😊,P7的东西呢是在掌握P6的基础之上。

需要再掌握这么多基础,分布式理论基础篇是吧?CAP拍个sraftgo这些都有分布式算法,杀丁算法,拍个损做法ZI。漏桶令牌桶这些都有,这些算法都得会,就是分布式解决方案中的一些算法。好了,这是第第二个。

第三。框架原理源码剖析,几乎所有框中间件和框架的源源码,我们的课程里都有讲到。一堆spring的n的MQ的或者sportELK的这里面都有有。好了,第四,分布式架构设计核心技核心高性能架构设计篇。

这个也是我讲的,这是我们的三高项目,软件质量的标准。是吧怎么做DNSCDN多地制质量正反向代理分流。然后服务的并并行并发,整体服务服务内部并行、服务集群。然后再往下走。缓存的设计,缓存的收益。

缓存的分享点,缓存更新清理地址等等等等。然后存储的设计关系、关系数据库、索引、海量数据的优化等等可靠性设计。是吧串联并梁冗余,连内三中心一地多活。然后应用保护类的设计。隔离限流、间极熔断、恢复都有。

好了,这个是我们这个是我们的高性能架构设计片,分布式架构设计片案例驱动。然后这里面就有很多是吧?数十万超高并发的设计N科9是吧,99。999%。😊,那个通用的设计。

还有就是呃基于云的云计算的一些架构的东西,还有就是一级流量多级缓存的专题,这里面都有好了,P7的技术我给大家说完了。ok k。好了,这是上面这是上面的技术点。学完技术点之后呢,我们还有项目。

比如说我们有一个东宝商城,然后这个商城的项目呢里面有前端的架构点开。就是作为一个后端,你也懂一些前后端是如何交互的。如果你懂前端之后,你在工作中会更加顺利一些。就是你知道跟前端该怎么交流。

别前端说我要这么调,你说不行,然后你又说不出理由,这就尴尬了,是不是?然后还有就是后端的架构,这个你当然得懂啊,然后后端架构需要用到这么多东西是吧?包括配置中心注册中心网关路由限流认证。

链路追踪数据同步数据检索缓存。分布式解决方案等等,这里面都会有。好了,大数据。link离线数仓实时数藏数据弧。在这个项目里都会讲到,还有AI数据分析。

用户画像、用户画像、购买预测、购物车分析推荐系统用户行为分析是吧?包括库存的预测,这里面都会有。还有就是云原生架构以后怎么把它放到云源身上。

docker kubernets、国斯fi、普罗米修斯这些都会有ok所以说我们以这个项目为。为驱动把前端后端大数据AI云原生全部在这个项目里给大家实现。好了,还有就是呃其他的一些项目。

比如说游戏服务游戏服务器,然后东宝,这是单体版的东保,这是给没有做过项目同学做做技术储备的一个前置的一个项目,还有网约车,这是我讲的,然后今天所讲的那些内容呢,就是网约车里,我原来在课上讲的一些内容。

比如说今天讲的分布式事务,我在网页这课里讲了。好久是吧,分门书我就讲了后面的十节课。你也课两个小时,还有前面的就是在生产,在工作中项目怎么做的,这里面都有。好了,这是我们的呃课程。这是我们的项目。

还有就是大规模电商个性化追加系统,这个就呃放到了AI数据分析里,放到了东宝商城里面。还有就是流市流市处理平台,这个放到了大数据里面。是吧就是把它都融合在我们的电商项目里了。OK好了,这个收起来了啊。😊。

同们,这些都是自己在线看视频学习吗?这么这么多需要学多久啊?一时苦笑是吧?你也不用苦笑,在我们这里呢,我们会给你根据你的情况给你制定你的专属的学习路线。你也不用说担心东西太多,需要学太久。

其实不用根据我们以往的经验,大部分人学3到6个月就能达到,就看你什么什么诉求吧。你要说明年金三一次涨薪,那你就学3个月了是吧?只有3个月时间,那你就学3个月,我们有面试突击班让你学习。

如果说我要做一个两年的规划是吧?那我们可以从技术的深度技术的广度,从架构从大数据给你做规划,这些都是可以的。对,就是这个冰冰说的学多久,看你的需求,是看你的诉求是吧?你要想一个月是吧。

一周两周、一个月、三个月、半年,一年两年是吧,看你看你自己对自己的规划是多久,我们都有对应的学习路线给到你。OK这个就是我们呃我们课程。哎呀去这个就是我们课程的一个。呃,课程大纲的一个介绍。

如果想要这份大纲的同学呢,扫描屏幕右下方的二维码,找我们的咨询老师去要这份大纲。好了,这是我们的课程内容。第一部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有第二个。学习规划刚才我也说了,就是报名之后,我们有一对一的学习规划,可以给你制定学习路线。OK就是你跟着随习路线走就行了。然后我们的教学方式呢是直播和录播。就比如说我们每天晚上我们有直播。

大家可以看一下我们的课程表,稍等一下啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是我们的一个课程表,大家可以看一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值