生产者发送数据有两个线程:一个是main,一个是sender,main线程主要是将数据放入缓冲区中,sender数据主要是将数据发送到broker.
首先maIn线程线程经过send方法,这个过程中会经过拦截器(对数据进行处理),序列化器(数据需要在不同的节点存储和传递),分区器,这个是指定数据存放在哪个分区,在RecordAccumulator里面有几个分区就有几个队列,这里会将相应的数据放进去。
其次是sender线程,我们知道kafka数据并不是一下就发送到broker里面,因为这样会耗费资源,那什么时候发送数据呢,有两个条件:一个是数据的大小达到batchsize 默认16K,那如果数据迟迟没有达到呢,那这种情况下就一直等下去吗,当然不是,linger.ms设置时间,如果达到了linger.ms,即使数据没有达到batchsize。如何发送呢,sender线程发送数据以节点的方式进行发送,比如broker1,broker2,这里就会有两个队列,这里面有一系列的请求,如果broker1的第一个数据没有发送成功呢?这样是不是会产生阻塞呢,不会,最多可以允许发送5个请求。最后通过selector将链路进行打通,进行发送,broker会有ack应答,如果成功了,会将请求清理掉,同时也会将缓存区的数据清理掉。再解释下ack应答:这里有三种应答策略:0是生产者发送的数据,不需要等数据落盘应答。1是需要leader落盘处理才应答。all(-1)需要leader 和isr队列里面的所有节点收齐数据后应答,-1和all应答。