00:00
又要看冤望了是吧?行,那我们看一下啊,其实是这样的,那我们先看这个S这边的一个事物,它这边是不是有一个所谓的叫铺的事物,对吧,那我们点进去啊,点啊或者说这样我们把这个图拿过来啊。在我们今年当中这个事啊,我去把它拿一下呗。我打开打开之后呢,把这个图给它抠下来,我把里面东西呢,给它补全了,我们对着这个来看一看啊,就这些东西啊。放在这这个这这样能看清吧,好,那首先呢,它有个source,它去发送批量数据,或者说单条数据是不是都可以对吧?刚才我们看处理的时候,这边这种批量数据啊,因为它后面呢,都是一个put list,但是这个list当中可以放一条数据嘛,单条放的虽然是list,我没必要说list必须有多条数据吧,List里面放一条是不是也可以啊对吧?好,那如果成功了就commit啊,没有成功roll back啊,那我们更关心的其实是roll back他所做的事情,因为commit就是提交,真正的写进去就就结束了呗,相当于对吧,更重要的我们关心是roll back,因为我们今天提到过,在S这边呢,虽然有事物,我们这边稍微提了一下,说他还有可能会丢数据,还记得吗?对吧,那为什么呢,来我们结合着这个源码当中来看一看啊啊,那我们主要看啊,就往下走,它开启事物,然后呢往里放put。
01:40
对吧,往里放,然后呢,去commit提交,提交我们就不用管了,这是正常的,那我们主要看一下谁啊回滚back对吧,Back点进去它是一个看三个人是一个。接口对吧,所以呢,我们CTRLC给它先复制上,然后再按CTRLH看它的一个时间类。
02:01
呃,它实现类当中呢,点开这个地方呢,我们就以memory这个来说明OK吧,啊,一个China点开,点开之后呢,在这里面CTRLFCTRLV搜一下back啊,其实这样的它是调用的,那这边呢,有同学说可能诶这不是说back方法呀,那我们来点一下啊,就是说back这个方法它刚才调用的,我们是不是看到调用的back方法呀,点开它在这个里边来,我看到v back,其实他调用的do back对吧?啊,去读back,点开它又是一个什么没有实现的抽象方法了,所以呢,我们去看do your back c只从只能从哪了memory channel当中去看了,对吧?CF,所以呢,最终是不是还是跟刚才一样到这来了。啊,到这良好以后呢,我们来看一下啊呃,它呢,还去获取了一下所谓的这个例子。
03:00
啊,因为roll back里边啊,就是这个roll back呢,对于memory China而言,它不光有负的事物,还有take数,对吧,都会去操作它,当然呢,它会去判断一下它这个大小啊,其实我们可以一块来看啊,这个方法呢,在我们事物当中,如果说来看啊,我们点回来,点到这个think里面这一点我们照样这个事物是不是也会掉back方法对吧?所以呢,最终是不是都会走到刚才我们所看到这个many China这个都back这个方法一样的,对吧?他们俩都会去调用这个back,所以呢,这里边有这个内容他不习惯,但是呢,这个内容它对于负的list跟take list,它采用的方式可不太一样。的list,他干什么事的,他进来直接给他干什么清空了。他做的回滚非常简单粗暴,他直接干什么被清掉了。
04:02
这个丢数据的根本原因是在这,他直接给扔掉了啊,这个例子这边我没有说过他会丢数据对吧,因为他做什么事呢,来看啊。如果他先判断对吧,如果你这个例子的互为空。那么干什么是队列,这个所谓的队列是不是Mary看到自己的这样直接用的嘛,肯定是他自己的,对不对,对吧,然后呢,他ADD往前添加,然后干什么事,这个list.remove last,就是说这边只要你不为空,我就把你的数据移出来,给它添加回原队内。也就是说是这样的,对于China而言,它其实相当于是一个队列。啊,相当于是一个队列,所谓的队列它有什么特点啊,先进先出啊,那我们S呢,往这个队列里边从尾部放,而think呢,从头部拿。
05:05
队列嘛,先进先出对吧,我先放进来的肯定是先被我这个走。所以保证它的一个有序性队列是有序的,对吧?好,那这个呢从尾部起,这边呢从头部取啊,所以一旦如果说T事故,那边发生回滚的时候,他会做什么事啊。他把这个list里面内容remove last从最后一个开始移除,然后这边干什么,往队列头部进行一个写,是不是又给你放回China,那下一次你再take的时候,这次不是失效了吗?没成功吗?再take的时候这个数据是不是还会被take到?嗯。没听懂吗?来这是队列对吧,正常来说前面这里面假如说有很多数据,假如说有两条吧。有两条对吧,接下来他做什么事呢?他要去找我们先聊这个take里边啊,就think里面拉取数据,他拉取数据是不是从这里面获取到数据之后,放到一个所谓的叫take list里边,这边就没了,因为拉取出来之后,这边是不是没了,没了好以后呢,假如说他是不是拿这个list去开启事务提交,提交失败是不是要回滚,又调用到这个方法了,他判断如果你不为空,就说明你可能是这个例子的这边提交失败,对吧?不为空之后,他拿着这个例子里边叫remove last是不是移除。
06:34
相当于是不是也在清理这个take离子呀,对吧?那么移除它跟这个不一样,这是直接给它清掉了,而它移除的时候还往原队列当中干什么,而且往头往前面添加是从最后一个开始移除,往前面添压这个是为了保证有序,就刚才怎么拿的,我应该还按照刚才的顺序给它干什么对吧?刚才这个是第一条第二条,我拿出去之后,在例子里面是不是放的第一条第二条,那我往这里面追加的时候,是不是先放第二条,再放第一条才能保证原来的顺序,对吧?所以你看这啊,它叫remove last,移出最后一个往人家的头部添加at host,对吧?所谓的回滚就是将take个子的东西放回到原来的China里面。
07:25
能听懂这个意思,一旦这个里这个里边是否失败放回来,那这个会丢数据吗。不会,你失败了没有写出去,我又给你放回来了,对吧,我又给你放回来了,那下一次再有S来拉取数据的时候,是不是又把刚才没有成功的数据又拉走了呀,对吧?阿姨保证它成功,但这种我们说了这个这边呢,它不会丢数据,但是有可能会造成数据重复。因为什么情况呢?我们写到HDFSHDF明明写成功了,但由于通信出了问题。
08:04
就这边呢,没有接收到返回之消息,你成功了,没有告诉我你成功了。那对于整个事物来说,他是失败的,但是他没办法去操作,HDF说把刚才数据删掉,这个删不掉,已经写到HD,这个删不掉了,对吧,他只能说把这个例子清空,清空了,清空好以后呢,是放回到原队列,那再写一次是不是h.F相对来说有重复数据能听懂这个意思,又写了一遍嘛,对吧,他只能清空事物当中啊,它只能清空自己的一个例子,他不能说把已经写出去,写到ID,把数据给它干什么清掉,所以这个里边会造成什么重复啊,有可能会数据重复,而put list里边简单粗暴,它直接干什么。清掉,所以其实对于这个事物破的事物这边它是有可能会什么丢数据的,注意我说有可能就算做了之back在有一种情况下也不会丢数据,来看一下什么情况呢,我们结合着另外一个内容叫tell来说啊,那这个呢,我们要去打开一个源码。
09:18
我打开这个parent,这就是之前下的那个元宝包啊,到时候可以给大家,但是你们看的应该比较少对吧?呃,我们找到我们的太电压S在这我打开了啊,其实就太电压S这里边,这里边呢,它同样的,既然是S,它一定有这个process方法对不对。我们找到一个process方法在这儿,因为你也是一个source嘛,你肯定要实现人家的什么process方法,跟我们自定义的时候一样,对吧?哎,实现人家process方法结合这个来看啊,这里边呢,他在干什么事啊,首先它默认值off对吧?啊,他会去改,然后呢,它真正获取数据,发送数据在这。
10:04
啊,然后呢,我们点进去啊呃,哦,这是他不是啊,应该是处理,我们应该找那个处理啊呃,Close,然后呢,是这个内容真正的去获取数据,哎,这块如果说有数据了,对吧,这个只是去获取了一项文件对吧?Tell从根据ino的值去获取文件嘛,对吧?然后呢,我们点到这来T的一个process处理这个方法,这个方法当中呢,它会去读取所谓的event,然后呢,判断如果被空直接就走掉了,对吧,空了我就不需要往所谓的那个China当中去传了,更重要的是在这啊。是不是之前我们看到叫get China process,它前面获取数据吗?后面是不是处理,刚才我们是不是也写了这个方法对吧,只不过说我们写的是用单个事件处理的,人家这是什么?
11:01
批量对吧,两个方法都有啊好,那批量处理处理完之后呢,他去做一个科密的,大家看一下这个科密的他做什事,更重要的这个好,那我们大家说一下,就是在于这块呢,是不是刚刚我看到它成功了,它会去设置这个。Process信息啊,这个就所谓的我们看到以及设置到最后一次更新时间,对吧,设置位置信息,所谓设置位置信息,其实就感知将我们当前这一次消费到哪,就是说读取到哪个位置,是不是写到我们今年那个阶S文件里边,那下一次读的时候是不是接着这个位置读就好了,但是你要注意啊,他是在什么时候去come是不是成功。才去提交,好,那我们跟他说一下,如果我们用的是m China加tell s,它不会丢数据,大家想一下能不能想明白这个问题。
12:02
刚才我们看到慢当中。Put这边如果一旦发生回滚的时候,是不是直接将put list给他干什么清空了?但如果我们用的是tell,它不会丢数据,想一想能不能想明白这个问题,思考一下。位置还是原来的,如果我们用的是他就会丢出去,而用的低压就不会流出去。能不能想明白这个问题,能想清楚这个问题吗?想不明白对吧?那结合着我们刚才说的,只有成功了,他才会去重写他的一个位置信息,对不对?好,你比方说这有一个文件,我读到16行了,我就用行了,其实里面保存的是不是字节数啊,我就用行来表示,OK吧,现在呢,我用新写了四行,是不到20行了,是不是读了四行数据没问题吧,这四行数据是不是封装成一个批次,要准备往天里面去写,这个时候发现问题了。
13:27
假如说他发现问题了,他是回滚,回滚之后是不是从这个铺的例子当中把我四行数据给他干什么删了,而且你要注意啊,如果一旦发生异常,这个位置信息还会重写吗?不会,所以刚才的位置信息还是谁,如果发现异常是不是还是16,那你接下来S下一次读取的时候,它从16读还是从20读啊,从16读是不是刚才四亡数据,尽管你在put list给我删掉了,我又重新读了,对吧?是这样的一个情况,但是如果我们用的是NEK呢?
14:07
那那你发送四场数据,我接收到了,在put的list里边,我给你清掉了,你在S接着读的时候,是不是从第20个往后读了,因为ne cat它是不会记录什么东西啊,说你那个位置信息,我刚才读到第几条了,Ne cat从端口发过来数据,你怎么记入条数啊。按文件这种是可以的,对吧,我给你设置它这个行数,我重新读,因为它只有成功了之后才会去把这个20写出去了,对吧,那你成功了把20写出去,下一次接着20是不是没有问题,因为我成功了,一旦失败了,是不是在文件当中还是16这个数据啊,我下一次再来source,再来读文件的时候,是不是还接着16这个位置开读,对吧?那你把布得利删掉,是不是跟我们就没有关系。对吧,所以要知道一下啊,在对于这个利子跟不得利斯,它对于回滚当中呢,数据处理的方式怎么样啊,不一样对吧?啊它不一样,而且它回滚的方法呢,用的都是同一个,也就是说它这个对列啊,是支持to跟这个同时操作的,对吧?好那这个时候就有一个问题,有没有大家想到来我跟家说一下啊,假如说这个队列呢,这么大。
15:30
我拉取了一部分数据,是不是签测当中先给它删掉,因为回滚的时候是有重新放进来嘛,对吧?拉取了十个事件好,然后接下来我又干了什么事呢?队列当中假如说还有还有一些空位置啊,还有一些空位置,假如说呢,呃,他拉血了走了对吧?嗯,至少有十个空位置吧。至少还能放十个对不对,因为你刚拉走的,那么接下来呢,假如说有,你比方说有11个。
16:04
你比方说有11个好,那么接下来有11个空位置,大家想一个问题,如果这个时候啊,我put这边放了11个,或者说我哪怕放了两三个这种东西。放进去之后会怎么样,那你这边一旦发生异常还能回滚吗?假如说这边啊,总共还有11个位置,就是说你拉走了十个之后,还有11个位置我又放了,随便吧,我放两个六个五个对吧?啊或者说我放一个。我发11个把它占满了,你这边是成功了,这个这个铺的成功了,铺的失败了啊不是这个是铺的啊,说白了这个铺的成功了,这个失败了,这个失败之后是不是要回滚啊。还有地方吗?没有了,那这种情况大家想一下他是不是要考虑,因为这个队列刚才我们看到回滚的都是一个方法吧。
17:05
对吧,那这个方案怎么搞啊。他能允许这种事情发生吗?我肯定要给我这个这这边要干什么预留位置的,所以说这个他也做了处理了啊,大家不用担心这种事情在哪呢?我们来结合这个就是在put这边啊,我们切到这个所谓的so这边点进去啊,点点到这个commit方法里边走卡密的又是一个什么结果大家看代码的时候就很讨厌这种东西,是不是看了一点进去居然是一个抽象方法,还得找实现类啊,还是其实还是找这个啊F啊,它走的呢,其实是这个do commit啊,Do commit。他其实做了什么事呢?做了判断呢啊,他会给他干什么预留空间的啊,他会去预留空间的,如果说小于零,它就直接干什么,就泡一场走了对吧,不够了,他干什么,他说不能够提交这个事物了。
18:08
因为这个不够了,然后让我们去增加什么内存大小对吧?对对大,因为咱们现在看的是memory传,所以它让我们增加的是什么堆空间对吧?啊对空间内存大小,其实这个意思啊,所以说因为之前有同学问到这个问题,说你回滚的时候再把数据放回来,那万一空间不够了呢?其实它再往里放的时候,它就要做校验,对吧?给我们未来这个这里边预留好是吧空间啊预留好,因为你这个刚拉走的时候很有可能会失败,然后回滚还要写进来啊,因为刚才我们是不是看到了这个里面一旦发生回滚,是不是把刚才拉出去的数据还要写回来啊,还要放回来,那在放的时候你放不回来了,这个肯定不行,你可以允许说整个队列满了,你不让我往里铺的新数据不要进来了,可以,你不能说我刚才失败的时候,你不让我进来,那这个绿边就怎么样。
19:03
丢出据了吗?放不进来,不丢出去了,所以它是优先让谁放的,这这边放的啊,要预留空间的啊,所以这条就顺下来了啊好,那我们结合着这个内容再来捋一下这个过程,结合这张图来看一下整个的一个发生的过程,呃,正常的当然我们就不聊了,因为正常的组那就就没什么好聊的,就正常commit commit对吧?啊,那source发送数据,首先呢,他会把数据放到一个put list里边。然后尝试去干什么,做判断啊,去写对吧,当然其实他在往里放的时候,他还会校验这边,这边的空间够不够啊,如果不够也就不放了啊,也就不放了,也是删掉了,走回管了,对吧,就还是一样的,就发生异常嘛,如果够的话,正常的写进去,写的过程当中发现错误了,假如说这样啊,这是他自己管理的事物,我在写的过程当中,假如我有十条数据,我写成功了五条。
20:04
写第六条的时候失败了,这五条要不要删,这五条要删啊,这个要删这个他自己的事物,我们之前说的FDFS他没办法操作,他删不了,但是他自己在channel当中,这个会删了,会删掉,因为所谓的事物就一起成功或者一起失败嘛,对吧?啊,这个会删掉啊,这个会删掉,然后如果第六条发生错误之后,他要回滚,所谓的的例子里面回滚铺的是不是回滚,他是干了什么事直接丢掉对吧,非常简单粗暴,直接就丢掉了,就不要了。对吧,这这个这个过程好,那接下来呢,正常的S格里边是不是会去拉取数据啊,先解释从这里面把数据给它干什么,写到这个list里边,然后尝试往外部系统去写吧,写的过程中如果发生异常,他这个东西要做回滚,它的回滚跟这边回滚不一样吗?这边回本怎么做的,是要写回原队列对吧,而且写到头部对吧,大家看到这个他拿这点remove last,然后外面是不是。
21:13
Q,点I first往头部添加呀,因为它是一个队列嘛,整个是一个队列,你从这儿,我从这拉取,然后我如果失败了,我得保证刚才的顺序一致,所以呢,我得从头部开始写,而且呢,反过来写,对吧,对吧,刚才你拉取的一二,那我就应该按二一往里写。对吧,所以刚才我们说看到的那个方法,是不是说它那个方法是可点ADD,这里边怎么写的是take list.remove last对吧,先移出最后一个往你头部点掉at first对吧?所以呢,它就给它回滚回去了。啊,回滚出去了,好,这是两个事物的不同点,回滚的时候对吧,那么接下来还有一个,那这种情况下是不是会有可能会导致丢数据啊,注意我说的是有可能,那是基于跟S还有关系,看我们用的是什么S了,如果这个S。
22:10
能够记录位置信息的这种sources,也就是说它可以重复消费,重复读取数据的这种SS,那它就不会丢数据,因为他在事物成功之后,他才会提交他的一个位置信息。对吧,如果失败了,那失败的情况就是说put的list里面没了我位置信息是不是也没有提交,那下一次再source再拉取数据的时候,是不是从上一次16,刚才我们举的例子十六二十对吧,是不是从16这个位置开始拉取啊,这四条数据是不是在库的例子给删掉了,删不删本无所谓,对吧?那如果我们用的是。Net cat那就不行了,因为net cat是没有位置信息的,它不能记录我到哪一条了,它拉取永远拉取最新的数据,对吧?啊,是这样子的一个内容,所以至于负的数里边到底会不会定数据,还跟我们source有关系,对不对?
23:08
啊,如果我们用TDR,那不会丢出去啊,如果用了naca,那会丢出据对吧,而在这个例子这边呢。他是不会丢数据的,但是由于他操作了外部系统,他外部系统如果一旦写出去了,他没办法把它删掉,所以这边有可能会怎么样重复出去,因为刚才我们说的,假如说这整个数据都写出去了,但是写出去之后是不是得通知我们这边写成功了,我才真正的成功了呀,对吧,万一写出去了,通知过程当中通信出了问题没通知到,那这边是不是也要做回滚,也是发生异常了嘛,就类似于连接超时啊,或者什么样的一个异常信息,那是不是也要回滚,那回滚刚才已经写成功了,我回滚又放在前面再次拉取,是不是又写了一次,所以说这个例子里边呢,有可能会造成数据重复,而put事物这边有可能会造成数据丢失。
24:04
对吧?啊,有可能会造成数据丢失,是这个意思啊,要搞清楚这个点啊,只要跟第三方文件系统对接的时候,他都会有这样的问题,他不是自己管理的,他没办法删人家东西,对吧?啊,因为你写的是一个输出流往外写的,你删不好意思删不了,这是我们对于事物整个的稍微的结合类没有看太多啊,因为之前我了解到,呃,慧慧老师在给大家讲那个哈杜源码的时候,那两天大家比较崩溃是吧,所以呢,我们主要挑一些核心的东西给大家去看一看,主要的其实看源码啊,不是说需要你把整个源码背下来,而是要了解中间的什么核心的流程啊,你把这个理清楚其实就够了,原码就够了啊,不是说要把原码背下来没必要,对吧,或者说甚至把每一个方法都记住,完全没必要挑一些核心的,就类似于我们当时说要大家记得,呃。Put有put事物对吧,有put list啊,那边有take事物,有take list啊,这些东西起码在如果问到事物的时候,你起码这些名词一定要说出来,你不能说,诶我知道S跟China之间有事误,其他没了,你起码得知道一点东西对吧?啊,这个流程稍微的关注一下那就够了,源码其实是这样看的啊,就是说嗯,大家记的时候呢,不用说自己非得说把它点一点,然后呢,把它背下来,这个没必要对吧,结合着核心点去看一下就好了。
我来说两句