producer
是线程安全的。
两个线程
-
生产者客户端由
两条线程
协调运行,分别是主线程
和sender线程
(发送线程)。 -
主线程通过
KafkaProducer
创建消息 (ProducerRecord
) ,然后通过拦截器,序列化器,分区器的作用之后将消息缓存到消息累加器中.
分区器的作用
默认DefaultPartitioner
,默认进行hash%分区数
求分区,如果key
为null
,就通过每条数据进行通过计数器
累加,最大值是可用分区个数,轮询方式
取余数发往可用的分区中
RecordAccumulator
RecordAccumulator
,默认大小32M
,决定参数是buffer.memory
)消息累加器
的内部为每个分区维护了一个双端队列Deque。
消息批次
ProducerBatch
代表为一个消息批次,封装了多个ProducerRecord
,消息批次保证了减少了网络请求次数,提高吞吐量。- 每次有消息要写入消息累加器中的时候,会先去寻址消息所对应的分区的双端队列。
- 因为队列内部有很多个
ProducerBatch
消息批次,会从队列中尾部获取一个ProducerBatch
消息批次,如果消息的大小在被写入ProducerBatch
的大小范围内,则写入, - 如果没找到
ProducerBatch
或者大于ProducerBatch
范围,则会在队列Deque
尾新建一个ProducerBatch
producerBatch
默认大小16KB
,决定参数batch.size
sender线程的作用
- 后续
sender线程
从消息累加器中获取缓存的消息进行进一步封装,然后获取元数据,通过KafkaClient
进行IO操作,写入到页缓存
中。