00:01
好,那我们接着说啊,呃,现在我们已经知道,就是我们呃存的这个opposite从哪来啊,就是从这个数据里面提取出来的啊,现在我们已经把它传过来了啊,但具体这里面是什么东西呢?我们一会再来看啊呃,下面就是我们要去明白一下我们这个opposite的结构是什么,就是你将来要去维护,你到底维护哪些东西呢?对吧,那你要先想明白这个事情,就是卡卡中opposite中它这个维护的这个结构啊,或者是维护的这个信息都有哪些。嗯,这个话题的话,大家应该都知道吧。你们之前讲卡夫卡肯定都讲过。OK吧,来,那你想一下啊,卡夫卡中如果想要去维护这个upset。那我们就要说一下,卡夫卡中我们存的是topic。对吧,然后每个topic呢,它会有多个分区是不是,然后将来的话,我们是消费者再去什么消费你的这个数据的时候,我要去给他维护这个opposite。
01:00
对不对。那你看看他是怎么去维护的。这里面都会有哪些信息啊,同学们。啊来知道的同学你可以说一下啊,他是怎么维护的。有没有知道的?啊,别告诉我,这个没人知道哈。你学过卡不卡了,如果你连这个都不知道。那就说不过去了啊。怎么维护的呀?啊。真没人知道吧?来这个一起来分析好吧,首先我将来这个某一个消费者。对吧,我要去消费你的这个消息。啊,这还是有同学知道的是不是啊,来看一下啊。
02:07
这个还有还是有同学知道的啊,说这个key是group加ID加topic加分区,Value是当前的这个值。对吧,然后呢,KV呃,Group加。Topic加分区啊加offset对吧,这个说的是一个道理是吧,按照KV结构维护。啊行,这个说的还行吧,对吧,还是有同学知道的啊来说一下,呃,卡夫卡中啊,我们是通过一个消费者,然后呢,去消费你的某一个topic,然后你这个topic的话又分什么,又分很多这个分区,对吧,那你想想哈,我在消费你消费你这个topic的时候,那我肯定是按照你的分区进行消费的。对不对,那我就说白了,我要去维护你的opposite的话,也是要什么按照这个分区呢,就做这个维护的,就你的哪一个分区我消费到哪个位置,哪一个分区我消费到哪个位置。对吧。啊,然后再一个就是从你的这个消费者这个层面上去分析一下的啊,你说我现在有一个消费者。
03:02
对吧,我去消费,假如说你有四个分区啊,0123,然后你这个topic的叫叫a topic吧。对吧,比如说呢,你消费到他是消费到了这个99啊,这个是98,这个是100,这个是101。那你就把这个维护下来,就是我的这个人啊,消费到了什么这个主题的这个分区的这个位置,这个位置,这个位置这个位置。对吧。那你维护下来以后,假如说诶将来我这个消费者呢,他这个出现问题了,我重新启动一个消费者,你说我想接着你去消费,他能找到这个信息吗?同学们。这个就得看你。是怎么维护这个人的了?如果说你是以单个人去维护的,那我告诉你,你就找不着了,因为后面来的这个人,他是不知道以前那个人叫什么名字的。对吧,所以说呢,我们就不能以人为单位进行消费,我们是以主为单位进行消费的,你就算你只有一个人,那你也是一个主,对吧?如果说你出现问题以后,那我再重新来一个人,我只要把这个人也加到这个主里面,他的主ID是一样的,那如果你的主ID是一样的,那我就可以拿上你的主ID呢,去找到你之前的信息。
04:09
对吧,所以说啊,你的opposite是怎么存储的呢?它就是这样去存储的啊,存储的结构写到下面啊,就是group ID加上什么呀,Topic加上partition,然后呢,他们去维护一个。能理解了吧?啊,是这种结构,好,那也就说白了,我们现在迫切知道的就是你是哪个主,你是哪个topic,你是哪个part,然后呢,你的opposite是多少?好,那我问大家啊,这个主ID topic这些东西我们是都可以从我们现在代码中得到吧。对吧,因为你看看现在你不就是你的,呃,这个topic在被这个主ID进行消费吗?这两个信息我已经得到了,那我接下来想要得到的不就是你的partition和OBS吗?这个东西从哪得到呢?从它里面得到。
05:01
明白我的意思了吧?啊,所以说我们将来要从从它里面去提取什么,提取你的partition加,诶opposite这样的话呢,我这个信息呢,我就都得到了。OK吧,同学们好,你要记住了啊,卡夫卡中去维护这个opposite的结构就是一个gtp啊,这就是我们的group idt就是你的topic p就是你的partition,你把这玩意给他记清楚了。好吧,记清楚了啊,以后你一想到就知道GDBGDB就完事了。好吧,行OK,那这个分析明白以后,下面就是在里面怎么存。对吧,用什么结构来这里面纯的话呢,就是这么几个问题,你用什么类型对不对,我们有字符串,我们有list,我们有set,我们有z set,我们有哈希,对吧?你的key怎么设计好,你的value存什么东西。对吧?你将来写入用什么API,你读取用什么API,对吧?这就是你每次使用red的时候,你要去考虑的问题,是否过期。
06:06
你把这几个问题如果能够想明白,那代码就可以写出来了。首先来先分析类型,你说现在我这个信息啊,将来我要去存了,存什么,存你的某一个topic对吧,然后呢,某一个消费者主,然后呢,对你的诶某些个分区的一个什么消费记录。对吧,这种结构你说我在中用什么醇呢。啊,同学们用字符串。还是用list还是用set,还是用还是用哈。用什么存呢?这个结构应该是挺清晰的吧,同学们你看啊,现在啊,我们的一个topic啊,它的这个是怎么维护呢,就是我有一个topic。对吧,我的这个topic里面有很多个分区。
07:01
对不对,然后呢,我的每个分区呢,又要维护一个set。对吧,你就看看这种结构呗,这是什么结构啊。是字符串结构吗?同学们,不是字符串是一对一的对吧,那你这个很明显它不是一对一的吧。是不是很明显不是一对一的啊,那我用list好不好存呢?List你要去看list,如果你要存的话,我有一个K,然后呢,Value是有很多个。对吧,那你看好不好,方不方便去存,如果你的,如果我我把这个opposite作为VALUE6,我给他存进去了,那你存进去以后,你哪知道你的每个off是哪个分区的呀。对不对,这个你也看不出来。是吧,那你用sad z赛行不行呢?同样也不行,因为类不行,他们两个也大概率情况不行,因为他们的结构其实是差不多的,只不过呢,一个是可以去虫,一个是不可以去虫,还有一个是什么有序。那你这个一排除的话呢,最终是不是只得到一个哈希了呀。对吧,哈希就非常合适,因为哈希的结构是一个key key里面的话我们存的是什么?Fair value fair value field value。
08:04
那你想我是不是可以这么去做呀,我的key我就去体现什么,就体现你的group ID加topic。对吧,就是哪一个人消费了哪个主题,然后呢,我的field我就用你的partition,我的opposite,我的value就用你的opposite,是不是你的某一个分区的某一个opposite,某一个分区的某一个oppositeet,某一个分区的某一个oppositeet,这不就完事了吗?对吧,啊,你要学会去分析啊,说这就出来了啊,可用什么呀,Key就是呃,你的这个group ID加你的topic。对吧?啊,你自己怎么去,呃,写这个结构那就看你自己怎么去拼接了啊好,Value的话就是我们的field-value,那就是我们的partition partition杠什么呀?呃,这个是哈西是吧,把它去掉啊哈,Partition杠什么partition-opposite对吧,这是多个的。是不是啊,这个partition-upset这是多个。
09:02
对吧,等等啊,能听懂吧,好,那你将来写入,你怎么写入啊同学们。就是你怎么把这个数据写写写入到我这个,呃,这个这个RA中啊,那你用的是哈希,那你肯定要用哈希所对应的API了吧,对吧,哈西所谓的API那不就是h site吗。对不对,所以这个东西啊,肯定是HS啊,那如果说你想批量写,那就是HMS啊,这个我估计你们早就忘了。所以我就没有问你啊,行,其实这两个方法在这个新版的这个red中没有什么区别了啊,它也可以做这个,就是同时写多个好吧,好,那将来我要把它读出来怎么读啊。比如说我现在诶某个人想去看一下我对某个主题所消费的这个位置,比如说他有这个很多个分区,那我要读的话呢,我是不是要把整个是不是都要读出来的呀。对吧,那怎么读出来呢?不就是H2了吗。对吧,H,好行,那你说我存到这个red里面,这个东西要过期吗。
10:03
这个要过期吗?同学们,这个不过期吧,是不是我持续性的从你的卡不卡中去消费数据,对吧?你的实时任务只要是一直在跑着的,那我就一直在去走这个流程,那你不能说我前一秒存进去了,后一秒这个过期了,过期以后你还读不读了呀。对吧,说这个过期嘛,这个就不过期了。能听懂吧,同学们。好,那这个我们就把它这个分析明白了啊,行,那你分析明白以后,接下来就是转化成你的代码。对吧,那这个怎么转化代码呢?那就写呗,这还等啥呀,DEF,这叫什么,这个叫做纯是吧,那我就什么就叫save opposite save opposite。好,那我要求你最起码得给我传一个什么,传一个这个玩意儿过来,对吧,因为他是关键啊。打个包。好,除了他之外,还要传什么东西啊,同学们。啊,你是不是还得把你的GOID和topic给给我传过来呀?
11:04
对不对啊,因为这个是已知的东西,那你要把它传过来啊,说要把它传过来,那我就写到前面吧,写在前面啊,就是你的topic group ID。诶,对吧,我要把它传过来。能看到吧,同学们好,那么这样我就可以什么开始去写了啊行怎么写啊,那么你不就哦,先把你的这个什么什么key先给它处理好呗,对吧,先把key处理好来,我们就写一下就是key啊呃,叫什么key好怎么串,呃,那我们就用你的group ID加你的topic对吧,那我就写一个什么group I这个先写。先写topic吧,对吧,到topic到了topic,然后呢,后面我就冒号拼接了啊,然后呢,到了什么呀,给我ID。
12:03
对吧,这样就可以了啊,但其实一般情况下,我们在往里面去存的时候呢,我们的key上面的话,我们尽可能会表达他是在做什么事。能理解,虽然说他已经能够表达我们,就是我们的功能,他已经能够帮我们去体现了,能够实现了,但是呢,我如果说贸然去看这个key的话,我也不知道他在干嘛,因此我们一般都会给他一个前缀哈,就是叫做比如说你是维护oppositeset的,那我就写个什么oppositeset呗,我一看啊,你是维护opposite的一个key。对吧,这样会更好一点啊行,Key有了以后,接下来就是处理你的这个VALUE6呗,对吧,那处理VALUE6的话,我需要什么从它里面去拿。你能明白我的意思吧,啊,从那里面去拿啊,好,那么如如果你要拿的话,你最好对他做一个判断,因为有可能。我在我的这个任务中,我再去从你的卡不卡去消费数据的时候呢,有可能我本次呢,并没有消费到数据,你能明白我的意思吧,并没有消费到数据,所以说呢,这个东西你到底能不能拿出来呢,还不一定,万一说我这个批次我就没数据。
13:02
对吧,那你没有数据,你拿它能不能拿出来呢。是不是,所以你要做一些判断的啊,来我们写的话就这么去写。就判断一下,呃,我这个待会待待会再拼吧,啊就判断啊,如果说你的这个opposite ranges是不等于空的,并且opposite ranges的什么菜是大于零的,就是你你里面确实有东西的,对吧,你有东西我才考虑去处理你。对吧,他说这个,呃,最好是优化成点LA对吧?OK,数组的话,那就点LA吧,啊其实一个道理啊,它都是通用的,好吧,通用的啊,行,那么这种情况下我就可以干嘛了呀,是不是从它里面去提取了呀,来看一下它里面有什么东西啊,它是个数组,那我就使用什么opposite ranges,然后呢,做为一个for循环,循环出来以后它就是我们的opposite。Opposite range对吧?那我看下这里面有什么啊,Opposite range,你说这里面我想要什么东西啊,同学们,我是不是就想要你的partition加opposite呀,说是你看啊,它里面就有partition。
14:04
对吧,这是我的part,好,那当然opposite ranges还有什么东西啊,我们叫做opposite对不对?Opposite它有两个,一个是开始的,一个是结束的,那你说我用哪个呀?你消费到这一波数据,他会告诉你,你是从这地方开始消费的,然后你现在消费到了这个位置。你说我用哪个呀。我肯定要结束的吧,因为开始的这个位置是不是我告诉你的呀,同学们。对吧,按照我们的分析,是不是我告诉你从哪个位置去消费吧。对吧,那我提取的话,我还用把这个开始再提出来吗?不用提我都已经知道了,我要的是你啊,本次你消费到了什么地方,所以说我们用的是until,就是结束的啊,叫结束点对吧,叫and opposite。这就好了呀。能明白吧,那你把这个提好以后,我们下面就是想着说怎么去存对吧,怎么去存呢,你来看一下啊呃,我们就把这个都拿到这里面吧,对吧,好怎么去存呢?来。
15:06
往中存,嗯。我想想啊啊往上存怎么存呢?那那我们就这样,我先把这个my red讲什么get je先把它拿到,这是我的je,拿到je以后你看了哈,我们调的方法就是je点叫HM site或者什么h site吧,对吧,你看h set里面我们有什么方法呀。呃,我给你一个K,然后呢,我是不是可以给你一个。你看这个东西或者说呢,我找一找有没有更好用一点的啊。呃,就这个吧,你看一下它是不是支持我直接把你的这个fair的value fair的value是不是都处理成一个什么有条的一个map,然后直接给他存进去吧,就一次性都给它存进去,就省得你什么一个一个去存了嘛,对吧,那既然你要一个有TL的一个map,那我是不是可以考虑把这个玩意儿给它封装成一个map对吧?来,所以我就要这么去做了啊,就是我先创建一个,创建一个什么map,就是,呃,直接创建吧,别别写注释了啊,有这的map正就上一个哈希map。
16:14
好,然后呢,这个是有跳的啊,然后这里面放的都是字符串,字符串行,这是我们的叫opposite。对吧。行,那我拿到以后呢,接下来你看啊,我每次提出来一个,我就这么去做,就是opposite讲put put什么呀,呃,Put的时候,你看这里面key就是你的,呃,叫做part,对吧,Value就是你的and opposite。呃。To string对吧?因为它要的是字符串啊,好,To string这不就好了吗?对吧?那我把它里面这个所有的这个分区和opposite都提取出来以后,我就封到了这里面了,封到了这里面以后,你看了哈,接下来我再往里面去写的时候,那我是不是可以把你的red key写到这,然后再把这个opposite往这一放,这不就写进去了吗?
17:05
能不能看明白。对吧,这就把它写进去了哈,那写进去以后呢,一定要注意啊,你这个red开开以后呢,用完以后一定要关闭啊,就点close对吧,就相当于什么把这个连接呢,给它还回到我的连接池中。OK吧,那你看看这不就写好了吗?是吧,就是你把这个东西给我传过来,传过来以后呢,我从它里面把该提取的东西给它提取出来,提取出来以后呢,我封装成了一个map,然后呢,直接什么一次性的把它写入到我的中。看明白了吧,这就是一个存储的一个过程啊,好了,那就写完了啊,写完以后,呃,我们一会再来做最终的测试啊,先听一下。
我来说两句