00:00
好,那我们接下来看一下这个他这个API啊,前面的理论知识呢,都是那些东西啊,我回去呢,呃,要去整理一下啊,整理一下就像我们之前所说的,那你还是按模块来整理producer里边有什么知识点。消费者这边有什么知识点,开画集群这边有什么知识点对吧?啊画模块来整理啊,画模块来整理自己呢,把一张纸上去写一写,想一想能记到哪些东西,如果有的东西填不完整呢,去看一看文档啊,把它填完整啊,多写几遍就能记得住了这些东西。好,那我们看一下A篇,我们之间在整个讲的过程当中就说了第三章和第四章是卡的一个什么。重点对吧,啊一个理论就面试的时候要问到的,还有一个就是你开发的时候啊,开发的时候要用到一个点,好那看一下这个API呢,分为两块啊,生产者API和什么消费者API,诶这里面呢,也有什么。蓝牙器啊,这里面呢,还有分区器,到时候我们都会聊的啊,都会聊的,因为它有分区策略,默认的既然是哈希是否可以自己写分区策略,对吧?好,这块有一个比较难理解的点,在这块我们先看一下深产的API,那在深产的API之前呢,我们先要看一下消息的一个发送流程。
01:11
之前我们是不是看到了消息,他往低的发012345012301234502啊,那只是粗略了大的面上的一个过程,那我们从代码的细节来发,第一个卡夫卡,这个生产者发送消息采用的是异步发送的一个方式。什么叫异步同步,是不是之前讲过啊,它里面呢有两个线程,就是你写的代码是主线程啊,你调线的方法,它启动了一个线的线程。用S的线程去发送的,好,这个异步呢是这样的。我们之前是不是讲了一个A啊。对吧,这块啊,容易混的点来了。啊,很多人在这块呢,就第一次听的时候不理解这个事情啊,我们之前是不是讲过一个点,说接收到消息之后。
02:01
返回ACK就不重试了。对吧,大家当时想的应该是没接受到A的时候,假如说这样123。456。分两个批次发的。大家当时想的是123发过去了,A给接收到了,接着发456对不对。不是吧?幺三发过了之后接着发送。然后有789再来了,接着发789。啊,直接往上放。那有同学说你那个确认消息不是没有意义吗?我设置零设置一不是没有,设置负一不是没有意义吗?有意义它主要的如果说你123发过去了,等待一段时间没有,我没有这个ack返回来,我把123干什么要重发。讲的这个事,A那块地方我们没有说,它保证的是同步跟异步吧。我没有说提ACG等于零的时候是异步,AC等于负一的时候是同步,没有说这个事吧,它ACG保证的是什么东西啊?
03:03
生产者这边数据不丢失问题吧,对吧,保证的这个啊这边呢是异步发送啊,采用的是异步发送这两个概念,千万不要混了啊,比较容易混,因为大家想的AC接收到返回值,理论上是说接收到返回值之后接着往下发了。啊,接着往下发,但是其实不是的啊,他幺三来了,456来了,接着往下发发,但是它还有另外一个线程在维护着接收这个什么。A,如果这个AC没接收到,就要重试,就做这个事儿,他AC呢,只是保证这个数据丢不丢的问题,它不是保证这个同步同步的问题啊,所以呢,这个里面我们能看到在消息发生过程当中,涉及到两个线程,一个是慢线程。就是你写代码啊,你要写代码的一个现状,第二个呢是三线。他们有一个供养面料叫。行数对这个什么。计数器或者叫累加器啊,啊累加器,那这个呢,整个的图是这个样子的,两压现场我们来看一下啊,整个的一个关系啊,这个呢,你要记一下里边一个点,首先呢,里面有这么多东西啊,首先呢有一个主线程,有一个三道线程,它们俩是怎么交互的,就是通过这个中间的共享变量。
04:13
啊,这共享变量里边放的什么东西呢?就是我们那个待发送的数据。在发送的数据好,生产者这边呢,我们要经过。S的这个方法,它之后呢,交给了这个什么。拦截器对吧,然后这个叫序列化器啊,它里边一定有序列化器,因为存到卡夫卡的时候这个数据。你是不是看不懂啊,序列化了啊,它有个序列化器,序列化完了之后呢,要做分区器。啊,分区器啊,当然如果说你指定的分区的话,就指定分区,没有指定分区,按照K是不是经过这个分区器啊,假如说K也没指定默认的啊,它也是分区器里面起到一个作用,能听懂。啊,分区器起到作用,好,那接下来经过这一系列之后,他就把数据交给了。
05:00
那三的线程来取这个数据,然后发给卡不卡啊,发给卡布卡。啊,当然它可以一个批次一个批次的去发送的啊,一个批次一个批次的发送的啊,整个的是这样的一个过程啊,整个是这样过程,那这里面有几个问题我们需要去解决的啊,倒不是说这个现场的问题,而这块。这个顺序的问题,这个顺序呢。那我们怎么证明这个事情呢?我们有办法证明啊,后面写代码的时候你就能知道,第一我们会自定义拦截器,也会自定义这个分区器。这两个呢,都会自定义,你会发现自定义拦截器的时候,假如说前面我们传的数据是自定义,自定义它不是KV嘛,对吧,我们定义的自定义定义你会发现。拦截器,这它还是spring spring。但是到了帕上的这块传给你分区方法的时候。
06:01
不是司令了,而是。带数组的数组,那我们不用自定义这个什么序列化器,你能分析出来顺序吗。可以吧,啊,不能吗?我的意思是到我们写了代码之后,假如说这两个都自定义了,第一个我现在告诉你了,因为这个涉及到这个顺序对吧?啊,你要记住的这个顺序,第一个他在拦截器的这个时候,拦截器不有一个拦截方法,就跟那个里面一样,对吧,它是不是有一个拦截那个,但是这个里面呢,拦截的是这个。啊,Producer record啊,拦截这个内容,那个里面拦截的是even吧,是这样啊,都是一条消息,就相当于一条消息,只不过说它封装的这个类不一样而已。啊,封装类不一样,那拦截下来这个里边呢,它传给你的数据啊,就是它是一个方法传进来的参数是什么。还是string类型的。还是自定类型的,而到了你在自定义分区器的时候,它传的方法就是什么。
07:07
直接疏堵了。啊,他已经经过了什么序列化,一个在序列化前,一个在序列化后啊,一个在序列化前,一个在序列化后,是这个意思啊,要关注一下这个点啊,它的一个顺序这块呢,我们所要掌握的发送流程当中,第一个它有两个线程,你要知道一下。啊,这俩现场第二个它是异步发送的。这是第二个点,第三个就是发送过程当中,在map这做了一个什么,这三个内容的一个顺序,调用顺序,你要知道一下,诶,它经过了拦截器,经过了虚动化器,再经过什么分区器,其实先经过拦截器,这个是最好理解的,无论怎么样,有拦截器一定先走拦截器。对吧,如果假如说你先走序列化,再走爬地上呢,到拦截器里边把这条数据干掉了。那不浪费吗?对吧?有拦截,任何一个框架的设计的时候都这样,有拦截器,假如说他要经过很多组件,有拦截器,一定先经过什么拦截器,因为拦截器可能把这条数据给他干什么,给他过滤掉,对吧?那你过滤掉了,你先把这个做了,你就过滤掉了,你不是浪费时间吗?
08:11
能理解这个事吧,所以他在设计框架的时候也一定会这样设计,当然其实这三个东西谁先调用,谁后调用是没有什么区别的。对吧,最终三个都要经过嘛,是不是谁先调用谁后调用没有区别啊,但是如果说你把拦截器放在后面,其实会比较浪费效率,对吧,因为你做了无用功,有的数据你给他干掉了呢,是这个事啊,所以要关注一下,他呢已经先走,那这个呢,发送流程就是这块一个点啊,对吧,点那里边的什么bed啊,还有发送延迟到我们都能看到啊。我把脸。
我来说两句