温馨提示:文本由机器自动转译,部分词句存在误差,以视频为准
00:00
好,接下来呢,我们来看一下漏消费和重复消费,什么是重复消费呢?就是你已经消费了一遍数据之后,我又消费了一遍。那好,那漏消费呢,所谓的漏消费啊,就是我这个数据我没有消费到丢失了。那什么情况下会导致重复消费和漏消费呢?那下面我们来详细看一下对应的原理啊。打开第一个就是重复消费的场景,那这里面以这个自动提交offset为例,首先生产者呢,会把数据发送到对应的分区里面,那接下来呢,消费者开始消费数据,好,那这里面有一个自动off赛的一个提交,每五秒钟提交一次,是这样吗?哎,那假如说啊,到这个upet为二的时候,它自动提交了一波upet。那这个消费者是不会管你这个提没提交,我继续往后消费数据。那好,那我往后消费数据,那如果说我这块挂了呢,没有赶到下一波off赛提交的时候,比如说下一个五秒没等到,我已经就走到两秒的时候,不好意思走到这儿挂了。
01:06
那如果说你走到四这个位置挂了。那会会出现什么情况,那我下次再重启的时候,我会读一下这个off的位置,比如说啊,我记录呢,上次是读到二,那这次呢,我是从二再开始重复进行一个消费啊,那这样三和四是不是就重复了,那这个呢,呃是有重复数据的一个风险。那下面我们再来看一下这个漏消费的场景,什么情况下会导致漏消费呢?这里面哎,我们假设啊,设置的是手动off进行一个提交,那么当off被提交时,数据还在内存中未落盘,此时呢,刚好消费者线程被Q掉,举个例子。你这边呢,把数据发送过来。那我消费者呢,开始消费数据,那他消费到数据之后,他会手动的立即提交offset。但是,就在这一刹那。
02:00
你说你这个数据啊,还没有完全落盘的时候,在内存当中好挂了,他挂了这个up呢,提交成功了。那这事儿完了,那你下次再启动的时候,我一看哦,这个off为二的位置已经消费完了,那我是不是就不会从这儿开始消费了,我就从三开始消费,那么二这批数据我是不是就丢了。哎,这个呢,就是导致的漏消费,那好,那无论是重复消费还是漏消费,在生产环境当中,呃,我们希望要做到精确,一次性消费的话,那都是没法接受的。那应该怎么办呢?大家都是老司机了啊,应该有对应的想法,那就是采用事物的方式进行一个解决。那下面来看呗,哎,双击打开。行,也就是说呢,你要想真正做到这个,哎,完全的精确一次性消费,那你需要呢,哎,这里面消费者做到采用事物的方式进行一个处理,同时呢,这里面要求下游的这个消费者呀,必须也得支持事务。
03:02
比如说你得支持事务回滚,我数据往这面写,必须在这边反馈说成功了,那这事儿才OK,那如果下游不是类似于买SQ或者是卡卡这种支持事务的。那么他是做不到精确一次性消费的,比如说我们写到一个,那么这里hps里面写,那你要HPSHPS不支持事物的回滚,那么写到这儿,那他有可能成功,有可能失败,那还是有漏数据或者重复数据的这种可能性啊,这个呢,要知道啊,你要想完全的做到精确,除了这块采用事物是不前面生产者到卡法基群这块也得采用密等性加重事物啊。同时呢,还得做到这个至少一次,比如说A等于负一,还有对应的副本数大于等于二,以及呢,Isr队列里面对应的副本数也得大于等于二啊,这几个条件联合满足在一起,才能真正做到精确一次性消费,那后面呢,我们再讲这个Spark相关项目的时候,那那个时候呢,再给大家详细的说一下整个链路上如何做到精确一次性消费。
04:00
行,那先有个印象,知道怎么做就行了。
我来说两句