00:00
行呃,那现在我们就把这个数据呢,都写到ES中了啊,然后接下来的话,我们回头啊到这儿。到这儿啊,这是昨天我们提到的一个问题。啊呃,这个问题啊,涉及到一个这个状态的这个问题啊,我们再来把它这个分析一下啊呃,问题的话,我刚刚给大家这个也又分析了一下啊,我们再来看一下吧。就在我们这个日活宽表中哈。呃,因为我们是做了一个去重操作的啊,我们要把这个mid呢,给它记录到这个中。对吧,然后接下来的话呢,我们才考虑你的数据呢,要不要写入到这个ES是吧,那我们正常的逻辑是这样子的,就是呃,如果说你的这个mid呢,在这个red中是不存在的,那就代表着你这个数据呢,是要。写到red中的,并且的话呢,呃,你这个m mid要写的写入到red中,并且呢,你的这个m mid当前所对应的那条数据,我要写入到ES。对吧,我们做了这样的一个操作啊,就是说白了,我觉得什么只保留每个用户啊,这个或者是每个m mid啊,这个每日的什么,呃,应该算是第一条的这个访问数据。
01:04
对吧。好,那如果说你这个流程都是正确的啊,你写入写入成功了,写入ES成功了,那这个肯定没问题,那就怕一个问题,就是你写入成功了,但是写入ES失败了。对吧,那你说会造成什么问题,应该怎么解决?好吧,再想想这个问题啊。好想一下这个问题啊,我们我记得给了个图,诶诶那个图呢。去宠物在这儿啊,在这儿。对吧,你看完这个图啊,去分析一下问题。造成了什么问题?就一起来想吧,好吧,同学们一起来分析啊,你看啊。就现在的问题是这样子的,就是比如说啊,假设我们这个人啊。假设这个人,然后呢,我这个今天八点钟第一次访问,那我经过这个自我审查以后呢,我就把这个个数都去掉了,我是只剩他了呀,这个时候呢,我就要这个red去看了,我一看,假如说呢,它里面是没有这个m mid1001的。
02:11
对吧,那我就要把这个m mid1001的记录到你的什么呀,记录到你的这个red中,并且呢,这条数据我就要写入到你的ES中了,是吧?如果说正常流程你都写成功了,那没问题,好,那现在问题就是我的m midd1001的进入到瑞蒂斯呢,记录成功了,但是呢。我在写入ES的时候呢,出问题了。就没写成功啊,你这个没写成功,肯定是因为什么报错了啊,抛异常了或者怎么着的,你的代码就基本上就什么中断执行了。对吧,但是你代码中断执行了,你就想想吧,我的中我确确实实是把数据写进去了。对吧,好,那我来接着往后分析啊。呃,假如说你这个抛异常了,你的代码这个中断执行了,那你重新把它启动起来以后,那你这个项目接着往后跑,对吧,那你看啊,比如说我下午一点钟的时候。诶,这人呢,又访问了一次,那么过来以后呢,经过自我审查以后,驱虫剩下一个详情页,这个时候他又到red里面判断,他一判断说,诶,这个人呢,已经有了。
03:07
有了以后呢,这条数据就不可能再往ES中写。对吧,但实际上我的ES中现在有没有这个人今天访问的数据呢?并没有,因为这条数据没有写成功。然后呢,因为你这个中呢,记录了一个他的状态了,那就导致你后续的数据过来以后呢,其实也不可能再写到ES中了。那最终导致的问题就是?呃,因为你这个red中啊,它记录的状态呢,跟我这个ES的不一致啊,最终可能会导致我在ES中呢,诶在统计这个日活的时候呢,会少人啊。能想明白这个事情吧。会少人。啊,那你说。应该怎么办?啊,这个问题应该怎么解决?对吧,就是这个地方啊,叫什么状态,这个数据还原啊,问题的现象啊。
04:05
对吧,按照我们刚刚分析的啊,大家其实也能够想明白啊,主要问题呢,就是因为你red你记录成功了,但是呢,你的真正的数据没有写成功。但也是因为你的记录成功了,就会导致不管是你这个数据重发过来了,还是说你这个今天你后续的这个访问,你都不可能再写入到这个ES中了,就相当于认为你已经有你这么个人了,但是呢,ES中呢,迟迟是没有收到你这个人所对应的那个数据的。对吧。啊,那这个问题大家应该直观想到的还是,那我就把什么把这个写物和这个写物ES呢,给他什么做成一个什么原子绑定做成一个事物,这不就好了吗?对吧,你们两个要成功都成功,要失败都失败。是不是啊,那这个当然是可以的啊,但是呢,呃,这个事物,这个事情呢,在我们当前这个项目中实现起来就比较困难。啊,这个是比较困难的啊,同学们,所以说呢,我们就呃不再去使用这个事物,而且它这个局限性比较高,比较多好吧,所以这个事物这个方案的话呢,呃,我们这课堂上就不采用了啊呃,我们可以想别的办法啊,这个也比较简单哈,我就直接给他去说了哈。
05:09
什么办法呢?你看啊,我们刚刚分析过这个问题,不就是因为我这里面记录了人了,但是这里面没有记录数据吗?对吧。那我可不可考虑这么去做啊,就是如果说你这个写入ES失败了,那肯定就是什么你这个程序出问题了,要不你这个好好的怎么可能会写入失败呢。对吧,那你既然这个程序出问题了,那你这个代码的话就会中断执行,那我们就要什么重启我的代码,那你说我在重启我这个代码的时候,我是不是可以考虑让他们两个之间的这个状态呢,做一个同步啊。对吧,就是保证你们状态是一致的不就好了吗。那你说怎么做同步呢?很简单,我们肯定是以这个写入到o lap中数据为准的,那我就可以考虑这么去做啊,我把它里面已经写进去的那个mid。对吧,写进去数据的所有的mid都调出来,调出来以后干嘛呢?把这个ready给它盖掉不就完事了吗?
06:05
是不是你在想哈,就是我们red,比如说记录了有什么1001,哎,有什么1002,有什么1003啊,一直记录的呢,假如说我记录到1004了,我的数据呢,往它里面写的时候呢,对不起,1004没有写进来,但是前面的这个123肯定是能够写成功的,1002 10021003肯定能写成功,如果你前面的写不成功,你不可能写到1004。对吧,好,那这个时候我重新启动的时候呢,我就把它里面记录了这个什么m mid呢,提出来,提出来以后呢,往你这个动给它盖掉。就相当于你里面存的这个东西我不要了,我要什么以我的这个ES为准,我给你盖一份,这样的话,你想想是不是就可以把我这个red中多记录的东西。就会什么还原成我这个o lap中实际真正的一个状态。能明白我的意思吧,啊,那你这么做是可以的。啊,当然啊,这个还有很多方案,比如有的同学说,那我比对比对什么呢?我比对你们的这个mid写入了这个时间。
07:02
对吧,比如说你在往它里面写东西的时候呢,你给我带上一个什么,带上一个这个时间。啊,那一定是你最后写的那个数据可能会出问题,你前面写的数据肯定不可能出问题的,对不对啊,那我就拿上我这个最后写的数据,然后呢,跟你这个ES中的去比对那个时间。能听得吧,去比对时间啊,这样也可以啊,所以这个方案有很多啊,就是你你看怎么做啊,反正我们的目标就就是让他们这个之间这个状态呢,做一个同步啊,状态呢做一个还原,就是还原成这个正确的一个状态就可以了。理解吧,好来,这是我们这个问题的一个呃分析啊好呃,那我们最后采用的方案是什么呢?我就采用这个比较简单的哈,直接从它里面把这个所有的这个mid的调出来,调出来以后干嘛呢?给他盖一份,就这里面东西我不要了,我给你盖掉就完事了。啊,当然这个操作什么时候做呢?那肯定是你每次启动,每次启动你这个项目的时候,启动这个应用的时候,要去做一个。对吧,因为你停掉这个,停掉你的这个实时实时任务啊,实时任务你有可能是你正常手动去停的啊,也有可能是什么出现问题你去停的,反正就是你每次在启动的时候呢,我为了确保万一我都要什么把我这个项目呢,把我这个任务呢,诶这个啊,把我这个什么状态都还原了去做一遍。
08:14
对吧,啊,那你正常骑起来以后呢,你的一个实时任务正常跑的过程中啊,只要他不报错,那我这个肯定是能够正常去同步的。对吧,只要你一报错,那我就怀疑你们的状态可能会不同步,我就要什么在你下次启动的时候呢,诶再把这个状态给你还原一次。好吧,这样这样我们就可以解决这个问题了啊同学们。行呃,那这个分析完了啊,分析完成以后,我们接下来就是通过这个代码呢,去实现一下啊好。
我来说两句