00:01
好呃,那接下来我们就来实现一下了啊,那我们的方案是这样子的啊,给大家这个去描述一下啊,我们就回到回到这个诶。我的那个日活呢,回到这儿啊。行呃,就这里面我们需要去加一个功能,那我把这个单独功能我这样啊,我单独提出来啊,就是我们需要有一个状态还原啊啊呃,那我们会怎么做呢?啊,就是在这个每次啊启动应用,启动这个实时啊,实时任务前啊,实时任务十啊啊这个进行一次状态还原啊OK,咱们还原呢,就是将这个呃以ES为准啊以这个ES为准,因为ES是我们这个真正写物的数据啊,所以一定要以它为准啊,以它为准将这个将所有啊所有的这个m mid啊这个提取出来,然后呢,覆盖到。
01:03
诶覆盖到什么,覆盖到这个中啊,这就OK了。对吧?啊,所以这个状态这个问题大家将来也要注意啊,如果说你用了这个第三方的一个组件呢,去维护你的状态,对吧,那么他就极有可能会跟你啊项目中的什么真正的状态呢?诶不一致。对吧,那这种情况下,你一定要去考虑这个状态的一个还原问题啊好了,呃,那这个的话我们看看啊嗯。我们需要从这个ES中提取这个所有的mid出来,对吧,那我们这个得写个。得写个啥,是不是得写个方法了呀,从这个M,从这个ES中查这个数据对不对。是吧,同学们来,我们先这样啊,先把这个大概的过程给大家规划一下啊,叫还原啊,Reward你的stage啊状态。好呃,那我还原状态的话呢,这个这个这个代码在哪调用啊,这个代码一定是在你的这个一进来啊,我就要去调用它。
02:00
对吧,就是我这个任务一启动的时候,在这个位置我就要去调用它是不是还原状态好就让他们知道这个reward。能理解吧,任务一启动我就要去调用一次啊OK,那接下来我们看一下这里面怎么调呢?那这里面大概的逻辑就是,呃,从ES中啊查询什么呀,就是从这个ES中诶查询到这个所有的mid。对吧,假如说我们有一个E跳啊,假如它里面有个有有一个方法吧,叫search叫get吧,Get all。呃嗯,我想想啊,Search吧,Search。呃,Search by菲尔的,好吧,Search。BY。啊,是fair的吧,对吧,就是你给我,呃,指定一下你要查谁,我我给你查出来呗,对吧,我给你查出来啊,然后这里面你要给我的是呃,从哪个索引中去查对吧,然后呢,再给我一个就是费的名字啊。
03:05
对吧,你要查什么呀,你得告诉我是这样的吧,啊,那我希望你有这么一个方法啊,然后呢,呃,我先定一下啊,这个index name啊,这个我们要从什么呀,这个是从你的gmail到这个是你的dau,看一下啊dau info啊dau ino,然后1018,好,后面其实还是一个日期,对不对。后面还是一个日期啊呃,这个日期的话大家注意哈,这个地方就比较难受了啊,为什么呢?因为。我们正常这个还原状态,一定是还原你这个当天的状态,就是还原你这个今天的状态,对吧,因为你的实时任务嘛,你一定是在跑什么,今天的数据对不对,但是这个地方吧,嗯,我们是要考虑什么考虑我们是要这个生成数据这个这个场景的。对吧,但其实你很难啊,你没有办法的从这里面的去,呃,拿到你这个要生成数据的那个时间。
04:01
对吧,因为这里面跟你的什么,跟你的这个实施项目,跟你的数据是不挂钩的,我们只是单纯的一个什么状态的一个还原。能听到啊,所以说这个地方的话呢,呃,我们就没法去考虑这个生成数据这个事情了啊,我们只能是严格要求自己,你在生成数据的时候,只能生成这个今天的数据,对吧,这样的话呢,我在这地方就可以放心大胆的直接什么获取你的这个当前日期了,要不你差一个日期你就不好去做。对吧,你差个日期啊,然后你就这个不好去做啊,行,那我就什么这个简单一点了啊,直接获取这个当前日期了啊呃,这个当前日期的话就直接这样。Local data啊第二这个叫做啊。好,这是那个叫做data啊,这个它就是那个日期了啊,那为什么到data就完事了啊。Dollar data啊,这样就可以了,好吧,然后这个fair name,呃,Fair name就是我们的这个mid啊,对吧,我要查你这个说的mid啊,呃,那我就fair a fair的啊,行。
05:08
对吧,那我有这个方法,那我要求你这个方法呀,最后给我返回的就是返回什么东西呢?返回一个集合吧,就是M4啊,你给我返回一个集合,这个集合中的都是mid啊。嗯,累死,OK吧,你给我返回一个集合。能看到吧,啊,当然这个方案还没写啊,一会你可以再去写哈,行呃,那假如说我们把这个m mid呢都查回来了,查回来以后干嘛呀,同学们。查回来以后你要去想哈。想什么事情呢?这个东西。一定会有值吗?这个东西一定会有值吗?同学们,不一定啊,因为有可能啊,我今天的这个第一条数据过来以后,我写舞蹈成功了,我往ES写我就失败了。
06:01
对吧,那就说白了,我从你的ES中我是查不到任何数据的,那你说我的中我怎么去,我这个状态要不要还原的,那一定也是要还原的吧。对吧,所以说我们就什么啊,不管你这里面有值还是没值,这个状态是一定要还原的,那我怎么去还原这个状态,就是我把你这个中记录东西给它删掉,删掉以后呢,我把我这个ES中的数据给写进去不就好了吗?对吧,所以说你就什么不管三七二十一啊,状态的还原就是什么这个删除啊,删除这个red中啊,记录的这个记录的这个状态啊,啊他这个状态说白了就是那个所有的m mid啊所有的对吧,那这个怎么删呢?那就要这么去做了啊呃,我们。先把他的K拼出来啊,Red什么这个叫做dau的那个K啊,这个K我记得是叫做dau,后面是日期是吧?来我们看一下啊,别这个写错了哈,刚好kiss,然后呢,Dau对吧?应该是这样的名字啊,OK,那我就什么可以直接后面什么dau冒号,然后呢,糟了,还是我们上面这个data就可以了,对吧,这是你的K,然后呢,怎么删除呢,那就。
07:14
拿你这个摘呗。对吧,叫MY有跳点什么get je。好,把这个je拿出来啊。OK,这个je拿出来以后呢,注意啊,我们就删除了啊,就是je什么delete delete直接把这个什么的。Du,给他,他们干掉。对吧,这就把它删了啊,就是你不管我的m mid中啊有还是没有啊,不管这个有还是没有,我一定要把它删掉啊,但是这个删了以后呢,你一定要注意一个事儿,就是你要去判断它了,如果它有值或者没值,你是不是都得重新覆盖到我的中啊,对吧,就是什么将从什么从ES中,诶查询到的什么查询到的这个m mid啊覆盖到ES,呃,覆盖到什么red中。
08:02
好,那我们判断一下,如果说你这个mid是有值的啊,同学们,Mid是不等于空的,并且呢,呃,并且呢,这个mid的这个长度啊。长度是大于零的,好这种情况下我才有意义,对不对,好那我怎么做呢?同学们我怎么做呀。呃,这个你要做的话。那我是不是可以这么去做啊,就是直接摘字点,呃,我们之前这个写的是什么写,他写的是一个site对不对。你看一下啊,这个是一个赛吧。呃,我直接复制了啊,不想写了,对吧,这是一个site啊,那我就什么直接什么叫SI。呃,那我这个S的时候呢,它可以什么给一个K,然后呢,它支持我们给一个可变参数哈。对吧,字符串的一个可变参数啊呃,但是这个字符串的可变参数这个东西,因为它是一个Java的API啊,这是一个Java的API,那Java的API的话呢,可变参数就是一个Java的数组,但现在我们写的是SKY代码啊,它是不识别你这个SKY那个数组的。
09:09
说这个地方你在写的时候会比较难受啊,为什么难受,就是你呃不能这个通过他这个方法来做这个批量写。对吧,那我们只能这么去做啊,就是你要干嘛呀,就是MID4点,什么for,我去什么迭代一下,迭代出什么,迭代出这个每个mid,然后呢,你再怎么写啊,就是J类四点啊,然后叫什么SI。对吧,然后呢,把这个叫什么red的什么dak放到这,然后再把这个m mid放进去,是不是你就相当于什么你只能什么一个一个去写,但这个方式绝对是不好的啊,因为我们本来这个数据我就是固定的,那我一次性写进去是不是更好啊,你就不要一个一个去写了,对吧,我还是希望能够什么批量写啊,所以这个地方再给教给大家一一个方法啊,什么方法呢?呃,我们现在这个S的这个方法的话,我们就不能够什么再去正常的去做批量写了,因为它后面这个参数呢,我们是做不到的,因为你在这个SKY中,你没法定义一个Java的那个数组。
10:07
好吧,所以我们这么去做啊,就是通过je对象啊,我们拿到一个叫做pipeland,好呃,这个操作可以帮助我们去做这个P操作啊,你看一下它是什么意思呢啊,它你可以理解为就是一个管道吧,对吧,就是我先把数据呢,完整的写到一个什么这个容器中或者管道中,然后将来呢,这个数据我统一到ready中去做一个执行,就说白了,我先展够一波以后,然后统一去执行,好那怎么做呢?你看了啊,这里面就是pape。讲什么呀,注意它里面也有什么SI的,能不看明白它里面也有SI的啊,就是它里面的这个方法跟你的加面方法是一样子的,那我就可以这么去做了啊,我把这个多一个迭代好做一个迭代啊,还是一个for OK,这是我们的m mid好,然后呢,我就把它呀,一个一个的什么加进去啊,Red的什么duk,然后呢,Mid加进去。
11:02
当然这个操作啊,这个操作是不会在ready真正执行的啊,不会直接到red执行理解吧,而是什么先往你的这个管道里面放,那等你把它都放完以后呢,最后我们执行一个操作啊,这个操作就是这个样,叫做诶central,就是我们同步一下这个操作才会什么呀,到red执行理解了吧,那就说白了,我们把你这个所有的数据呢,全部都加到一个管道中,然后呢,统一做一个执行,这就是一个批次操作了。OK吧,行,那把这个操作做完以后啊,这个操作完事以后,我们最后呢,一定要记住把这个呢给它close一下。好吧,诶这样的话才可以啊,这就是我们这个状态还原的一个代码啊,你看整体的思路就是,呃,不管三七二十一啊,你这个ready状态是一定要去删除掉的,删除掉以后呢,我们再决定。要不要去做一个覆盖,如果说我从这个ES中我根本查不到任何东西,那我ready中呢,我也没必要去做覆盖,就相当于你这个ready中什么都没有,对吧?那如果说我们这个ES中能够查到东西,就比如说啊,这个是不为空的,并且呢,它的长度是大于零的,好,那我就要怎么去做一个覆盖操作。
12:16
OK吧,行,那这个写好了啊,那就写好以后的话,我们最后还差一个就是从你的ES中查。对吧,啊,这个我们先停一下啊。
我来说两句