00:00
回过头来啊,回过头来看谁呢?看我们现在它的一个短五功能实现,那目前呢,咱们要想统计日活,大家想一想我们现在它所实现的功能,对吧?基本上现在已经到这儿了,对吧?数据转过来,然后呢,交给到我们这个卡不卡,从卡卡里把数据啊给拿到,然后放在哪放到我们现在这个ES中,而且咱们现在在拿到数据之后,我们是不是对数据还做了一个去重啊,但是大家注意对吧,那么这块其实在干什么呢?是不是对卡卡数据对吧,来做咱们消费的呀,对吧?那么这消费的时候大家想一想会不会有些什么问题,能不能够保证咱们现在的消费是精准一次性消费。能不能保证咱们现在这个消费是精准一次消费的,对吧?那么咱们前面再带大家回顾我们的卡不卡的时候呀,说我们现在呢,除了精准一次性之外,那么其实呢,还有一些概念,是不是有一个什么至少一次,还有咱们这个至多一次呀,对吧,一个叫at list ones,一个呢是at most one,那么如果说咱们要是至多一次的话,那么它呢,有可能会丢失数据,如果至少一次的话,对吧,是不是有可能存在重复呀,对吧?咱们希望什么?我希望是我们当前这个消息的数据呢,只会不对吧,只会出一次对吧,哎,也不会这个丢出据,然后呢,也不会什么呀,对吧,也不会少对吧,也也也不会,也会重复,对吧,那么这个时候,那我就想实现精准的消费,对吧?那么现在想一想,咱们现在啊,这个时候会不会出现什么数据丢失啊,或者数据重复的事。
01:47
会不会出现数据咱们那个丢失或者数据重复。首先想一想会不会出现丢数据的情况?
02:12
会有出现丢数据的情况,那就想呗,咱们现在数据在哪在哪卡不卡里边是吧,比如说卡不卡里边有一个ABC这个数据,对吧,这是卡普卡的数据,然后接下来,那么咱们现在呢,好把这把数据交给谁了,是不是交给咱们Spark推明了呀,对吧,交给咱们Spark对吧?那么咱们Spark呀,拿出去之后呢,其实我主要做两个操作。拿拿到数据之后,我其实主要要要做两个操作,第一个对数据进行处理,咱们一般呢,对吧,可能是论盘,我现在其实保存在颜已颜色的地方了,那么另外一个我是不是得告诉人家说我现在数据啊已经处理完了,这叫什么什么改变偏移量对吧?大家想想我现在在拿数据的时候,原假如说啊,这个偏移量012对吧,然后一开始呢,我偏移量从零开始的,那么当你现在把这个数据ABC拿回来了,那么这个时候你是不是告诉人家,我现在我的偏移量我已经不是从零开始了,我是不是要从咱们二开始,你下次拿从咱们这个二往后拿,说从三开始拿呀,对吧,你是不是得告诉人家,所以说呢,我现在咱们Spark里边,那么应该有两个操作,第一个操作干什么呢?改偏移量,然后第二个操作叫什么呀,叫落盘。
03:27
对吧,其实就保存,其实就是对数据进行处理,对吧?那么然后接下来,那么最后把这数据呢,保存到我们这个ES上去,或者其他的关系数据库里来,对吧?那么整个咱们现在这个过程有没有可能出问题,有吧,对吧,大家想一想,如果说你现在改完偏移量了,对吧?那么改完偏移量之后呢,那意味着我现在已经把咱们的这个ABC给读到你这个SPA里边了,他那边就处理完了,然后结果刚改完直接在这挂机。就咱现在Spark就成以当机了,那你现在就等于落盘了吗?没落盘,那你启动之后,你在读的时候还会从零开始读吗?不会吧,对吧,就是咱们现在注意啊,咱们这里我们设置的时候,我们设置的是怎么设置的,我们现在是不是从最新开始读啊,但其实不对,那我应该从哪,我上次读到哪了,我是不是应该从哪读啊对吧,但是你上次读哪了,他认为你这个东西已经把反正这个二读完了,你应该从三开始读了,对吧?所以说呢,那咱们现在如果出现这种情况的话,是不是这个数据是不是就丢了呀,对吧,那说老师那我现在那你别别别让他在在在在这什么呗,提交偏移量你往往后放一放呗,注意提交偏移量这个事儿咱们现在控制不了。
04:40
对吧,我们是怎么做的,默认情况下它是不是自动提交平移量,自动提交平量怎么做的呢?默认五秒钟就五秒钟,你的程序推到哪,它不确定啊,叫他不确定,所以说咱们有可能出现丢数据的情况,来把这个图好好给大家看一看啊,这个呢,我就不在家画了,同学们第一种数据丢失的情况。
05:01
来看一看,比如说啊,那么咱们当前在咱们这里边,这个是不卡不卡不数据,然后这块呢,是我们SPA streaming这个程序对吧?然后接下来,那么如果在咱程序对吧进行处理的时候,你已经把咱们那个偏量修改完了,但是呢,还没有对数据啊进行落盘对吧?那么这个时候对吧,那么咱们的进程突然崩掉了,那么这样的话是不是咱们的数据丢了对吧?就相当于什么,相当于你现在出现了咱们这个at most one至多一次的情况,对,因为这个东西已经执行过了对吧?这个呢,会丢失数据,那么除了这种情况之外,大家想一想,那么咱们现在这个不会数据呢?对,那数据如果这块搞定的话,数据重复的话,相对要去简单点了吧,同学们来看一看,往下走,什么时候数据重复,前面是干什么,前面是对数据啊,来进行我们这个落。
06:01
盘,原来你看咱们是不是把落盘放到后面了,现在我在整执行的时候,他干什么呢?先落盘,就是我从卡卡里把数据读到之后,先都是把数据呢落盘了,比如说保存到A里面来了啊,比如说保存到咱们A里来了,但是这个时候我修改偏移量了吧,还没有对,还没有修改偏移量对结果呢,就在咱们现在短这个录完盘之后,在修改偏量之前,咱们这个进程断掉了,咱进程断掉了。对吧,那大家想一想,那我现在呢,这个偏量数没改,当我进入起来之后,他从卡卡拿数据从哪读,是不是从咱上次这个偏量的位置开始读啊,对吧?那你想这个数据咱们是不是已经落盘了,你再从咱们这个上次的位置读,是不是相当于又把这个数据是不是又读了一次呀,对吧?那么这个时候他其会出现一个什么情况,会出现数据重复的情况。这是咱们现在的这两种情况来,同学们对这两种情况能理解吗?
07:04
啊,就是说我现在呢,在咱们执行的时候呀,对吧,那么我现在呢,有一个精准一次性消费的一个事,注意啊,首先你先给我弄明白,这个精准一次性指的是谁,指的是消费,就是咱们从卡卡里边这个这个消费者对卡卡飞进消费,他的精准一次性和咱们刚才讲的那个说老师刚才咱们也讲精术一次性了,对吧,但是那个呢,是我生产者对往咱们那个卡不卡生产卡不卡本身对吧,它的基础一次性对吧,就是开启密的性,其实就可以保证啊如果再不行的话,加个事物对吧,加个事物,那么咱们现在呢,那么这里对吧,我怎么去保证经一次性呢?对吧?那么首先呢,咱们先分析一下对吧,如果说我直接按照我们现在思路,对有数据对卡卡数据进行消费的话,会不会产生我们现在这个数据丢失或者数据重复的问题,那么咱分析了一下对吧,这两种情况,同学们这两种情况是不是一个会丢失数据,一个会拿数据重复啊。我问大家这。
08:04
这样的情况目前能不能跟上,能不能理解,可以吧,那么如果可以的话,咱们现在在讲解决方案,怎么去解决呢?怎么去解决呢?怎么去解决,对吧,大家发现这两哥们,这两个东他应该是一个整体,要不然同时成功,要不然同时失败,他俩只要是对对一个一个执行,一个不执行,是不是就出问题了呀,对吧,所以说那么一说,要么同时生动,要么同时失败,大家马上想到什么了,事物。对吧?哎,所以说呢,那么咱们要想解决的话,其实对很容易啊,怎么解决呢?对吧?哎,咱们把它俩放到一块,放在一个事物里边,那么事物的特性对吧?那么什么ACD对吧?那么其中呢,对吧?那么咱们原子性指的是什么?指的是A,咱们多个我们的操作之间是一个整体,要不然同时成功,要不然同时失败,那我现在如果要是使用事物的话,大家想一想,这个东西不是你想用就想用的。
09:09
对吧?你意味着什么呢?意味着你在这块对数据进行处理要落盘,那么你落盘的话,那么你是不是就相当于把这个数据保存到一个数据库里面去的,那你的数据库有要求啊,你的数据库就在支持事物啊,如果你数据库本身不支持事物的话,你说我怎么去保证事物,对不对,不是所有的数据库都支持15的吧,对吧?你像咱们关于数据库它支持15,但有些数据库你不支持15,如果数据库本身不支持15,那么这个时候对吧,你想一想你就没有办法用这种方式进行处理。你就没法进行优点方进行处理,对吧?哎,比如说我现在要是买四五这还行,但如果别的我现在不支持15,对吧,那怎么办呢?对吧,那你没办法,比如ES对吧,ES我在讲就给你讲事物了吗?好像没有讲什么事物,这个事是不是对吧,没有对吧,那你想想我这怎么怎么怎么办,处理不了对吧?而且如果就算你通过事物处理方式的话,大家想一想,这个东西你的偏移量你是不是也得往数据库里边来维护啊,对吧,就说你数据库里面应该有两个东西,一个呢是我们的一个落盘数据,那么另外一个偏移量你是不是也得往数据库里面操作,对吧?那么这个时候呢,他们两个才是一个的整体的操作,对吧?那么要求第一个数据库支持十,第二个同学们,假如说是买思路的话,你这个数据量能太大了。
10:31
如果太大的话,买四是不是受不了啊,对吧?哎,所以说这块呢,注意看同学们,咱们现在呢,做了一个分析对吧?做了一个分析什么呢?所以我现在啊,那么如果说要想去解决我们这个精准一次性的话,那么这个时候呢,咱们就可以啊,去解决数据重复,数据丢失的一个事儿就行了,对吧?那么之所以会出现,就是因为我们现在啊,这个它是自动提交的,每五秒钟对吧?诶自动提交一次对吧,但这个呢不靠谱对吧?那么咱们怎么解决呢?我们分析了一下,咱们可以利用我们这个这个观于数据库它的事物来进行一个处理,对吧?把谁呢,把我们这个修改偏移量,还有我们现在的这个落盘操作,对吧?放在一起,注意如果使用事物的话,同学们,你想一想,他俩谁在前谁在后有关系吗?没关系,只要它是个整体是不就行了,对吧,但是呢,我们的事物啊,那其实呢,对吧,这个也有这个好处,有弊端,好处是什么?
11:31
好处是可以保证基本的消费,这个大家应该也能理解,但是问题的限制是这个数据呢,你不管是偏量也好,你不管是业务数据也好,它必须要放在某一个关系性数据库里边,并且它是支持咱们事务的,对吧?一般咱们都数据库里边,它可能没事物,对吧,那这个你用不了。对吧,然后第二个一说事物它本身的性能呢,就不够高,如果说我现在要保存数据量比较大,对吧,那么这个时候呢,你往买搜里边,这就不太合适了,对吧,说老师那MY搜Q里边数据量大点也没问题,我可以支持什么呀,我可以支持咱们my soq集群,大家注意啊,有一个对吧做开发的时候,对吧,做开发的人经常或者避开的一个问题什么呢?就是我们的分布式事务。
12:19
想一想同学们,我现在买这款,假如说一个节点不够了,我现在三个节点,102 103 104,对吧,然后接下来你的数据呢,保存有可能保存102,有可能保存103,有可能保存104,你现在要保证他们,要不然同时成功要同时失败,这里出现的一个关系叫什么呢?叫分布式事物,其实我现在这个东西啊,这个同一个咱们事物中,那么它在不同的节点,有的102,有的103,有的104的这个东西处理起来很麻烦。啊,这个东西出了挺麻烦,所以说呢,那么咱们现在呢,在咱们这开发的时候,好多呢,其实都是把这个东西给它避开,那么如果说在我现在Spark里边,那么一般呢,我们也是对吧,把这个东西呢给它避开,怎么避开呢?提升一定咱们这个效率,比如说我现在在到inco里边,我我在执行的时候,我现在有三个ex,对吧,那我在提交时候,我可以怎么办呢?我可以把in数据都给它收集过来,收集到哪,收集到driver。
13:15
对吧,那么如果输据最右端的话,是不是就在同一个节点来对吧,就不涉及到咱们这个这个失误了嘛,对吧,就不涉及到咱分布式失误了,对吧,然后再进行操作对吧?但是这样的话呢,它本身的这个性能肯定对是比较差的啊,肯定比较差的,所以说一般咱们如果要使用这种解决方案的话,一般什么场景用呢?就是数据足够小,足够少,对吧,然后接下来呢,并且咱们支持数的数据库,对吧,这是第一种啊解决策略,解决策略对吧?那咱们先想一想,这个适合咱们吗?目前咱们现在往一来测是保存数据对吧,适不适合咱们现在这种日活的场景。不适合吧,首先第一个我的日志数据量是比较大,第二个咱们也该测试说没有什么事物啊,所以说这两个咱都不符合对吧,所以说呢,这种方式咱们得pass掉了啊,这种方式咱们呢就pass掉了。
14:13
那么如果这种方式pass掉了,那接下来那怎么去解决呢?我现在这个东西好不容易找到一个解决方案,利用事物把它做一个整体来进行处理,对吧?哎,但是呢,他pass掉了,那你说怎么办?那你说怎么办?我问大家,咱们现在如果不是基属一次性的话,会出现两种情况,一个呢是至少还有一个呢是之多,这两个让你们选的话,你们能够接受哪个at least还是at most at least对不对?所以说呢,咱们现在哎,我可以接受它,那么如果说啊,你现在能够接受它的话,大家想一想,首先呢,咱们第一个这个数据呢,对吧,这个落盘,那么数据落盘的话,那大家想一想,那咱们现在这里如果说啊,我现在这个偏移量对吧,没有修改啊,进行崩了,那这种数据是不是很重复啊,那重复的话,其实咱们可以过滤一下驱重嘛,对吧,那或者说我现在说老师这个驱虫怎么做,其实有的时候可以不需要咱们做,对吧,假如说我现在呢,这里面你采集到数据对吧,其中呢,有一个谁呢?比如说有一个mid是100的,Mid的是101的,M是102的,然后接下来我现在把这三条数据往以elect保存的时候,那么。
15:38
我可以把幺零、100、101和102作为他们的一个search index防护文档的ID。那么A本身大家想一想,如果说你再把这数据给我,我再往A里插入的话,它还能插入吗?是不是插入不了呀,因为A本身它在执行我们的put操作的时候,它是不是就是可以保证密等性的呀?对,也就是说我如果说我现在啊,往里S里边放数据对吧?那么你不管put的多少条,只要它存在了,那么最终是不是只会有一条了,这是什么?这就是它的密等性了。
16:12
这命令性,那大家想一想,那么咱们现在在这里,我如果说要是at least one啊at least ones的话,那么它可能会重复,重复的话,咱们是不是可以通过什么呀,是不是可以通过咱们这个密等性去解决呀,对吧,可以通过咱密等性对吧去解决一下,那么另外一个说老师,那你这块这个就得有一个东西啊,你就不能随便对吧去什么了,随便去改变位置了,对吧,大家想一想,如果说你现在把这种情况还好,就是你现在先对数据进行落盘,这种情况还好,就那么如果说我现在把这个东西他俩换一个位置,同学们还是我们现在at的例子ones么?不是了,是不是,所以说咱们现在这个偏移量的修改啊,它那个时机是不是就不能随便来卖了,你不能上来让他先去把偏移量对吧,给他改了对吧,那么所以说呢,我现在啊,又有另外一种解决方案了,怎么样呢,我可以。
17:12
手动去提交或者修改偏移量,也因我如果是偏移量交给谁,交给咱们现在系统自己做的话,他这个偏移量到底什么时候改,我确定不了,有可能在落盘之前,也有可能在落盘之后,如果落盘之前的话,那么这个时候大家想想是不丢数据了,那么你为了让他不丢数据,这个偏移量你是不是得在咱们这个数据处理完毕之后,然后你自己来改呀,所以说咱们要想保证精准移动消费,第一件事手动提交偏移量。那么第二件事,如果手动提偏价的话,那么一旦在宕机了,有可能会造成什么呢?造成数据重复,咱们怎么去搞定呢?是不是可以通过密度进行处理呢?所以说咱们现在的第二种保证,我们现在啊,它的一个精准性消费的方式的话,就是手动提交偏移量加密等性的这个处理,来实现精准一次性消费。
18:06
啊,其实我们密等性现在其实双重的,我在咱们red里可以去一次虫,对我到咱们里边也可以去一次虫,保证密等性,这个对吧,应该对咱们来说不难啊,对咱来说不难,注意同学们对吧?这块来家看还是我们现在这个内容从卡卡里边来消费数据,然后接下来那么SPA推命呢,对应的数据来进行处理,处理你怎么处理,你先对咱们这个数据啊来进行处理落盘的一般是这样对吧,保存,然后接下来那么咱们呢,自己去来提交,就你都处理完之后,咱们自己手动来提交偏移量啊,就处理完之后手动来提偏量,如果正常执行那没问题,对吧,你的数据也改了,你的偏移量也改了,但如果说中间这块要当机的话,那可能会出现什么情况呢?可能会出现数据重复,没关系,咱们现在再保证它的一个密等性是不是就OK了呀,对吧,保证密等性是不是就OK了呀?看一看同学们这种方式能接受吗?
19:06
在学的时候很痛苦,同学们对吧,就这块密等性啊,你学完之后呢,以后你不管在哪都是这一套程序,对吧,我会给你们介绍两种方式,对吧,事物在咱们项目里边我也会用,对吧,然后这块呢,就是这个第一次你写的时候呢,对吧,就是们写代码呢,光分析的时候大家就觉得呀,比较麻烦,写代码说你第一次在写的时候呢,也会很麻烦啊,你你也会觉得很麻烦,对吧,但是这个代码呢,对吧,会有让你写个五遍以上嘛,就在项目里面就可以写五遍以上,对吧,你根据自己的一个情况调整对吧,什么时候觉得哎再写就不行了,直接吐了对吧,你就可以复制粘贴了。啊,要不然你自己不停的练啊,先来看一看啊,咱们关于我们现在呢,它的一个逆转性的保证,对吧,通过这种方式,那么这种方式呢,那咱们呢,也得分析一下啊,也得分一下,呃,那么如果说啊,我现在要想去使用它的话,对那么这块呢,一般对吧,什么什么样的一个场景适合呢?第一个处理数据比较多,对第二个或者数据保存的不支事物的数据库上,这两点好像咱们都占了。
20:13
对吧,这个日志数据比较多,另外一个ES呢,这也不支持我们的事物,对吧?所以说呢,我们现在就是这种方式,对吧?但是呢,有难点什么呢?在实际开发中啊,手动需要偏移量,其实不难,难的什么呀,密等性的一个保存对吧?注意啊,一般假如说啊同学们对吧,就是也没有主见,也没有什么一些我们的唯一标记让你去实现密等性了,基本上你实现不了对吧,就是我现在要实现密等性,你是不是一般是有主见比较容易啊,对吧?哎,所以说呢,有的时候你现在呢,这个密能性的话,靠谁,靠数据库本身,如果数据库本身不支持我们现在呢这个密能性的话,对吧,那么只能先去保证数据不丢失,然后呢,这个重复到时候再说。对,再想别的办法好了,这是关于我们现在的把这个命运性这一块,把这个稍微停一下。
我来说两句