00:00
好,那接下来呢是DWS,那DWS呢,我们主要说了两个需求就够了,嗯,一个呢是关键词。需求,因为我们需求比较多,对吧,根据那个事实来的嘛,因为还是一样的,你实时表那有哪些,这边的需求就会有很多,当然整个的是根据这个指标体系建设啊,因为它需要在指标体系建设里边,我们需要把这个衍生指标。抽取出来。对吧,把这个原子指标以及这个统计周期啊,诶。统计力度相同的需求,把它拎出来设计成一张大的表,对吧,设计成一张大的表,因为你最后的指标它是有这个。嗯,除了刚才我们所说的几个,还是还有一个业务限定啊,对吧,那我们在建DWSM表的时候,就不不考虑这个业务限定业务,业务限定呢,是一个V字段,那是最终你查的时候,比如说最后。
01:00
我去我去查这个。表形成形成我们的什么,形成我们可视化那个图的时候,那我是不是分s PU trademark各种各样的,但是我在建这个DWS表的时候,是不是把这个s PU trademark什么categy全部都怼到一张表里边,大家记得吗?对吧,是这样的一个情况啊好,那第一个关键词需求。啊,关键词需求啊,那指标体系建设到了后面,我们下午再聊在离线收仓里边啊,那关键词需求呢,我们主要的用的是circle。啊,那就是提取时间,时间。太重。对吧,呃,自定义。UD。TF函数。对吧,还有那个IK分词器的使用,对吧,这个需求我们要单拎出来,因为在DW层只有这一个用的是S。
02:01
啊,所以你要去关注一下这个东西,那后面还有一个是什么呢。不用想,就是最复杂的那个需求了。啊,就是用户。商品力度。下单。对吧,下单的一个业务逻辑啊呃,那为什么要抽取它来聊呢?最关键的还不是在于关联微调操作吧,最重要的诶,那我们把它拎出来是因为它,而不是说它里边有多张表啊啊去怎么怎么做啊,倒不是的,就是关联维表操作。对吧,这块呢,首先我们写了一个Phoenix。啊,或者说叫JDBC啊。悠久对吧,这个呢,倒还行吧,倒还正常对吧,只不过说呢有点复杂,因为我们里面用到了这个泛型啊,用到了这个泛型对吧?好,那之后呢,我们把它又进行了一个封装,封装了一个DMMU,因为我们发现在当前这个项目当中,我们要查的数据,所有的搜狗写出来都一样,都是谁select,新from t where ID等于A什么什么什么。
03:14
对吧,所有的数据都是这样子的,所以呢,我们就又封装了一层啊,那正常的去做这个处理,但是呢,在我们测试的时候,测试发现延迟过高。对吧,所以呢,我们有了第一次优化。优化一。对吧,U1呢用的是旁雾。缓存缓存这里面有这几个点,第一,缓存的选择。啊,有这个堆缓存。哎。有堆缓存,有独立。缓存服务。
04:01
对吧,对于缓存呢,就是我们说的你在本地的开关内存它呢,嗯,效率高。对吧,延迟低。啊,那独立缓存服务呢,你至少是一个服务,你呢要去连接效率肯定不如我对于缓存好啊,那独立缓存服务没有好处吗?便于维护对吧,可复用可复用可修改可删除。啊比较方便对吧,那你堆不好,你呢写在代码里边的,那我其他人再来访问,我只能再自己创建一个,我没法用你的,很麻烦。对吧,那很明显我们的维表这个东西缓存过来,维表肯定要被复用嘛,对吧,所以最终呢,我们还是选择独立缓存服务,因为我们那个数据还得更新。还得修改对吧?啊,那如果不更新呢,你用这个对缓存也还好点啊,那你还要更新还要修改啊,那不行对吧?啊,那所以呢,选择就搞定了,然后呢,我们做了三件事,第一。读缓存。
05:01
对吧,缓存没读到不费那斯,然后呢写缓存。啊,最后还有一个数据更新时。删除缓存对吧,我们做了三件事,但是这里边有一个点,我这个东西呢,我要跟你详细的说一说啊,就是之前呢,呃,没有细说啊,这个呢,在面试的时候呢,也会聊,就是数据更新,哎,呃,那我们想啊,这边呢有两个,有两个情况就是数据更新的时候,那比如说啊,我们在这边写一下数据更新时有两件事要做一个,哪两件事呢,将。更新的数据。写入。Phoenix还有一件事对吧,删除。数据。好,那呃,你现在去思考一下这个东西呢,我们。
06:01
这两个操作啊,它是跨两个系统对吧,没办法一起操作了,有一前一后,那谁先谁后会更好一点呢。就是先去写Phoenix好还是先删好呢?嗯。想一想啊。我们应该。怎么做嘞?你觉得你现在去思考一下对吧?好,假如说呢,两种情况先。这个啊。他有可能会出现什么样的问题,对吧,或者说呢,用这个。
07:07
先删除。在这个好,那我们想一下啊,呃,比如说我呢,更新的时候我先写到Phoenix。晒SHRA,那嗯,他是这样子的,这种两个操作呢,就跟我们消费卡不卡数据一样,一个提交一个提交数据对吧,一前一后,那如果两个都失败了,或者两个都成功了,那没有问题。对吧,好,那我们要考虑的是一个成功,一个失败,那你这种是串联的吧,有没有并行对吧,就是说先做它再做它,那做完了之后再做它,所以呢,那要成功也是前面先成功,后面失败,对吧,比如说。呃,先写菲尼克斯成功了。失败了。
08:01
好,假如说这个修改操作,本来呢,两边都是小写的A。啊好,那我呢,在MY里边改了一下,我把小写的A啊改成大写,它不是有更新操作嘛,对吧,我发现更新操作呢,我把这个地方改成了A,但这没改掉没删掉,没删掉的时候,我用户访问数据,我就关联为表,是不是关联它是小A啊感觉这种不太靠谱吧,因为你成功了,你失败了会导致数据不一致,对吧?好,那这种呢。如果是这种呢?对吧,如果是他呢。它的话我们来想一下啊呃,那还是一样的,两个呢都是小A啊,然后呢,我把小A呢变成大A了。变成大A了对吧,好,那我先把它删掉了。我先把它删掉了,删掉以后呢,成功了,对吧,但是他改失败了,那改失败了,最后呢,最终啊,肯定还是重新改嘛,因为这个数据失败了,包括这个也一样啊,上面这个一样,因为你这条数据没有成功,没有成功你挂掉了对吧,你还会重新消费,因为卡夫卡嘛,重新消费最终呢会改成功,但这个就没问题了,对吧,因为呢,你怎么样。
09:14
你先删了。然后呢?再去改,假如说第一次没改掉,那也没关系啊。对吧,好,那这种看上去啊,这种看上去是不是要比这种要好一些。能理解吗?这个是不是直接导致数据不一致啊,关键的是之前有一个学生在面试的时候。面试官是怎么问的呢?他说因为我们课堂上写的就是这种,你可以去翻一下啊,我写的是这种先删red数据再去写非你可以翻一下代码用的这种方式,这个面试官呢,就提出来这个问题,他说当你删除成功以后啊,我也不是说这个第二个失败了,也没有失败也能写出去。啊也能写成功,更新成功,但是呢,你把这个A改成大A嘛,就更新出去,对吧,在这个中间。
10:04
我有一次查。这个面试官问的问题还挺刁钻的啊,就是当你删成功了。我呢,这个数据被查了一次,他会怎么样,那我还没有更新啊,注意还没有更新,在在你更新数据之前,我查了一次,他查到的是不是还是小A,小A又把它写到red了,诶你刚删的怎么样,又写回来了,嗯,最后呢,又改成功了,诶这边是大A,这边小A。毁了。是不是数据又不一致了?对吧,还挺刁钻的,那如果说这种问题我们该怎么解决呢?人麻了。
11:01
嗯,面试官。还蛮刁钻的,大家说是不是?啊,挺刁钻的。保存一次,对了。对了,就是整个的呢,锁这咱们加锁跨系统诶。跨系统啊,就是啊。再来一次。有同学说,这样。这种方案行不行?再来一次。对吧,我再删一次,我延迟双删这种方案啊,叫延迟双删这个行不行呢,其实这种也不行,为什么。因为当你这成功了,然后呢,在这查了一次,又变成小A,好,那就变成了什么。退化到了这种情况。假如说你成功了,失败了呢,又不是不是又不一致不行对吧,所以怎么做呢?这里边有个最好的处理方案,就是不要删除,当更数据更新时。
12:00
啊,但是这种呢。就麻烦一点,因为数据大小写的问题啊,会比较麻烦一点,当数据更新时。干什么呢,先。将。更新的。啊,直接把添加数据,因为我们说了更新了对吧,肯定是更新的数据啊先。将数据。直接写入,注意啊,写入啊在。将数据。写入F,我不删,直接写。啊,我直接往ready写最新的数据,哪怕你先写ready成功了,再写入非利失败了,我都不不不用担心,对吧,因为你比如说现在呢,你俩都是A好,那我A呢变成大A,我把数据改了,改了之后呢,先改ready就改啊对吧,写它不是覆盖吗?用的string覆盖好变成大A,哪怕你第二步操作挂掉了也没关系,你这个时候人来读。你这个时候人来读对吧,读的话也没关系,因为你读到的是一个大A,我有。
13:05
对吧,那就是说你这个数据不一致啊,没关系啊,你这个都失败了,失败了以后是不是挂掉,挂掉之后呢,会重新消费,重新读取吧。对吧,重新读取那会怎么样呢?哎,重新读取之后呢,最终这个是不是会变成就最终它俩一致的,而且中间有人来查也没关系。对吧,中间如果有人来查这个数据,它也没有关系,因为我呢是最新的数据。对吧,哎,得这样处理一下,那这个是之前有面试官问到的啊,所以到这块复习的时候呢,我把这个点给大家去说一说。啊,这样大家印象会更深一点,我觉得在刚开始的时候说啊,大家就懵了。啊,本身加这个独立缓存服务的时候,大家就很晕了,对吧,这一块当时写代码的时候挺痛苦的吧,我就没有把这个复杂东西呢,那个时候去说啊,在复习的时候呢。回过头来咱们就清楚了啊好,那最后呢,这个点啊,还有一个优化二。
14:04
对于当前这个需求而言。优化二对吧,咱们用的100。EBI啊,这个就没有什么太多可说的,就正常的用ebo的一个API就行了,只不过说那个函数写出来比较麻烦,因为咱们又用到了泛型。对吧,又用到了这个泛型。啊,EIO对吧,这个操作呢?啊,关键问题在于还有一个点我们需要跟大家提一下,面试官可能会问,那你这个数据量这么小对吧?啊,为什么还要用这个什么跑路缓存ebo o乱七八糟的用一堆。啊,那你是不是考虑到第一我们做压测对吧,成倍的去压测的啊第二。我们未来数据量会涨嘛,对吧?啊,这个点不能忘了啊,别一问懵了啊,还跟面试官说,诶是是是当时不知道怎么想的,不要这样对吧?嗯,有理由的咱们就可以用这些啊。
15:03
对吧,啊好,这是我们关于这个DWS层里边最重要的就是它了,尊重他了,那其他的就是窗口操作啊,刚才我们复习窗口的时候也说了,对吧?啊,怎么样去获取这个窗口时间啊,既用到增量又用到全量啊这种方式对吧?最后adsads数据接口,那这个接口里边S都比较简单一点了,因为它怎么来的。你都是从DWS里边出来的,对吧,DWS呢,已经按照十秒一聚合,十秒一聚合了,所以呢,这边就好了,对了,这个十秒一聚合我还得说一下。你面试的时候大可不必说十秒。啊,你要真要开装两三秒或者一两秒都可以。OK吧,因为毕竟是一个实时需求,咱们做十秒是没办法,没必要搞更快,对吧,我非得搞个两秒三秒没有意义啊。大家也看到了,我们当时做可视化的时候那个sugar,它对于这个大屏尝鲜版就是试用版本。
16:02
它最快的刷新频率是十秒一次,那你这个窗口两三秒你也看不到效果呀,那个大屏还是十秒钟才能看到一次效果,对吧,这意思,所以呢,你没有意义,那我们呢,可以不按照十秒聚合对吧,两三秒啊都行,就看你公司当中对于这个实时要求嘛,对吧,甚至我不做。聚合我直接把这个明细写出去,对吧,效率更高也可以啊,都没有问题对吧,ADS数据接口就是在。窗口聚合的前提下再做聚合,无非就是有一些延伸指标对吧,啊两个指标呢,求一些什么比率啊,或者类似这样子的啊,这这就这些东西对吧?好,这是我们整个的一个实时书仓里边所涉及到的东西,我们写了那么多天。对吧,因为我们的表比较多,所以呢,里边有很多是重复工作啊,挺好的重复工作,因为这样的话就是本身的这个需求,由于业务不同,本身把代码呢,就练习了很多次,对吧。
我来说两句