概念

Kafka的Producer发送消息采用的是异步发送的方式。在消息发送的过程中,涉及到了两个线程——main线程和Sender线程,以及一个线程共享变量——RecordAccumulator(两个线程之间共享的)。

main线程将要发送的消息包装成ProducerRecord 之后放到RecordAccumulator(线程共享变量),Sender线程(守护线程)不断从RecordAccumulator中拉取消息(ProducerRecord)发送到Kafka broker。

image.png
消息通过main线程发送的时候会先经过 interceptors(拦截器)过滤掉一些不要的数据,然后再给消息进行序列化(网络传输),然后消息会进一步通过partitioner 来确定这个消息要放哪个partition里面,然后按照分区放到RecordAccumulator 容器里面, 在进入到RecordAccumulator容器之前消息就已经确定好了要去哪个分区了.

Sender守护线程就负责从RecordAccumulator容器里面拉取数据,往对应的Topic的partition里面拷贝.


batch.size:只有数据积累到batch.size之后,sender才会发送数据。
linger.ms:如果数据迟迟未达到batch.size,sender等待linger.time之后就会发送数据。