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