00:00
啊,那我们刚才呢,是把这个数据可靠性保证这块给大家搞定了啊,这块里边呢,就是我们稍微混合一下,呃,主要就讲了一个AC机制和一个IR对吧?好,那我们继续来看啊呃,那接下来看这个exactly once1,那怎么放在这块,那同样的这个又是什么意思呢?对吧,这个呢,Exactly once这个叫精准一次性。那除了这个单词之外,我们看一下其他的两个,先从那个意思上我们来了解一下,还有一个叫at least once,这个大家应该比较清楚叫什么。至少一次对吧,那还有一个叫at most once叫之多一次。啊,只多一次,那这三个东西有什么关系呢?来看一下,至少一次之多一次,那当我们如果说把AC设置为负一的时候。他是不是可以保证我们数据不丢失,对吧,它会保证不丢数据,但是它有可能会怎么样,重复数据对吧?啊重复数据OK,那接下来如果说我们将AC设置为零的时候。
01:11
是不是我们生产者只发送一次就不管了呀,我也不管你有没有接到,也不管你有没有写入成功,对吧?OK,那这种呢叫atmo ones叫至多一次,也就是说我只发送一次,最多呢,只发送一次,这种呢有可能会丢数据,但是它绝对怎么样,不会重复吧,因为只发一次,这个不存在和重复的一个现象出现,对吧?好,那我们继续,但是这两种情况呀,都有一定的问题,都有一定的问题,一个是丢数据,一个重复数据,对于我们来说,是不是生长环境当中,大家应该能想到,我们更多的时候希望是精准一次啊,就是说就是一次不丢失,也不干什么不重复啊,对吧?OK,那这个呢,就叫做我们所说的exactly advance这个内容,那它是要结合一个什么内容呢?结合着我们下面要讲的一个幂等性来做的一个事情,好,那首先先不聊这个密等性的事,那首先大家去想一想,如果。
02:11
我想实现这种精准一次性消费,你说是在这个至少一次的基础上,还是至多一次的基础上来做一些调整呢?对吧?因为单独的直接用至少一次或者制作一次,这都不靠谱啊,肯定实现不了精准一次,对吧?那我们就想结合着哪一种情况去做这个事情呢?对了,应该是结合是什么?至少一次吧,如果说至多一次它有会数据有可能会丢失,那这个时候我们没办法做吧,那在我们至少一次的基础上,你不是说至少一次数据有可能会重复吗?那如果说我们能做到把这个数据给它干什么去重,是不是就得得到这个事情对了啊,那这个就是这个意思,好,那我们看一下啊,其实我们引入的这个幂等性呢,就帮助我们解决来看一下啊,在这幂等性加上我们至少一次,等于精准一次性。
03:11
那幂等呢,是在0.1版本之前所做的一个事情啊,密等性才引入的,来看一下引入了一个重大的一个特性幂等性,对吧?那如果在0.1版本之前没有这个幂等性啊,我们先不聊这个幂等性干什么事的,没有这个幂等性,那我们如何保证呢?是这样的,这保证的是那个内容在这儿我给大家已经标红了啊。那我们所知道卡布卡整个的一个数据关系呢,是生产者发往博,然后消费者去消费吧,同时可能还有多个消费者组,那如果数据在这里面重复。啊,因为你是重复数据了嘛,啊重复了,那我们是不是可以到下游的消费者这块来干什么,自己做一个驱虫,但是呢,这种情况比较麻烦,就是因为我们卡不卡的一个数据啊,它可以发送给多个什么。
04:04
消费者组啊,也就是说同样的重复数据,有可能你当年A消费者组B消费者C消费者组呢,都是重复了,那你每个人都要去干什么。去重对吧?啊这就很麻烦,那对于卡普卡整个的一个框架设计来说呢,它在0.11版本的时候,它引入了一个密等信,那这个密等信呢,就解决了是我们数据重复问题,而且它在哪解决的呢?在我们broke啊,也就是说卡普卡集群这块帮我们就解决了这个问题,帮我们解决这些问题,那这样有一个好处,就是说只要在卡卡基金当中,我们处理一次这个重复数据就OK了吧,不需要交给每一个消费者组,他单独的去处理这个事情。啊,只要处理一次,那这个呢,就是我们接下来要聊的这个幂的系。啊,幂等信,那我们想一想啊,这个地方幂等信其实讲的就是一个什么事情呢?就讲的是在我们卡夫卡当中,他去做,去冲,它为什么叫幂等呢?幂等其实是我们数学上的一个概念啊,形容一个函数,你无论对它做什么样的一个操作啊,它都是自己吧,假如说零这个数字,你乘以任何数字都是零啊,对零这个数字呢,去做乘法操作,无论做多少次,它都是回归原来的一个值不变,对吧,那幂的线一样的在我们卡不卡里边,这个mid系体现到无论你当前这个数据发送多少次,我只保留一次。
05:28
啊,只保留一次是这个意思,好,那我们看一下它是如何来解决这个密等性的。啊,解决这个重复问题呢,那大家想一下,如果说让你们做这个去重数据的一个去重,你应该想到什么问题。对,按照某一个主键来做去动嘛,其实这个东西呢,在Java当中很多地方,什么set呀等等这些地方是不是都是按照这种去动的,OK,那我们就聊一下,这个卡普卡当中,首先第一个你要开启幂等信,也就是说将幂等性的势能置为处,你当你把它置为处之后,它的一个a cck就默认就是什么,就是负一了啊,这个你就不用管了,你不要改它了啊,你当你想使用幂等信的时候,你这个地方呢,哎,只为负一,它就能帮助我们做到精准一次性消费啊,精准一次性的写入啊,OK,那我们接下来看一下。
06:20
如何来做到这个重复数据的一个去除呢?是这样的,首先我们知道生产者代码啊,假如说没有当年我们现在还没有写到这个代码,对吧,但是生产者他其实是一个客户端啊,我们所聊的了,因为之前我们都聊生产者呢,他会连到我们什么。当前的卡法集群,此时呢,由卡法集群给大家分配一个PID,注意这个PID跟我们之前所聊的那个PID不一样,不是进程号,这个PID呢指的是producer ID啊,给当前的producer呢分配一个ID,同时你当前这个producer在正常的运营过程当中,如果说发送消息的时候,它跟每一条消息还要添加一个number,一个序列话号,注意要做一个区分,这个序列话号不是我们所讲的之前那个offet啊,跟offet没有关系,它是随着我们这一条数据,哎,你有十条数据给它编个号,一到十啊,一到十它会同时传输数据到我们博士会的同时,会将我们当前那个什么。
07:24
Pad分区以及这个序列号。同时发送,发送完了之后呢,Broke会对我们的一个数据做一个什么保存啊,做一个数据做一个保存,如果说你同一个客户端发往同一个分区,诶这个序列化号还是一样的时候,那我就要做什么做去重,因为我只持久化一次,当我发现这三者都一样的时候,我认为是同一条数据,我不做写入。啊,不做写入是这意思,好,那这里边呢,其实大家也能发现一个问题,当我们如果说producer挂掉了,重新启动的时候,A producer去重新申请一个pip,跟之前的不一样了吧,啊,不一样了,所以呢,密等信只能解决单次绘画单个分区里面的数据重复问题,如果你跨绘画了。
08:17
啊,可画画的意思是什么呢?就是你producer挂掉了,我重新启动了,那就重新建立了连接,对吧?那这个时候呢,它并不能保证这个数据啊,不重复,如果说你刚才发送了一个什么AA啊,挂掉挂掉,它没有收到这个返回值,把AA又发送了一次,那这个时候呢,呃,对于考法集群,它还是会重复写入的,也就是说这块也给大家勾出来了啊。PID重启会发生变化,一旦发生变化,我们的主件就不一样了,主件不一样,你尽管数据内容什么东西都一样的,但是对于我扛了集群来说,我认为它是不同的数据,所以呢,他没办法做到什么。分区间跨分区啊,或者说跨绘画,更重要的是跨绘画这个做的什么精准一次性的写入啊,大家要注意一下,但是它在单个分区同一次绘画,也就是说这个生产者你启动之后没有挂掉的情况下,哎,它是能保证我们什么精准一次性写入的啊,精准一次性写入的是这意思。
我来说两句