KafkaProducer
1. 主要的成员变量
KafkaThread:producer启动的时候会创建一个线程,这个线程里面有个重要的Sender
Sender:sender也是在producer初始化化的时候创建的,两个重要的东西KafkaClient(即NetWorkClient),还有个重要的东西RecordAccumator
发送数据的时候会调用recordAccumator.append方法,recordAccumator内部有个暂存数据的ConcurrentMap,这里主要维护了一个双端队列,而且队列的成员是ProducerBatch,这里面才是缓存数据的,batch里面又用了MemoryRecordBuilder来缓存数据,append数据的时候最终到append到了memoryRecordBuilder里面,memoryRecordBuilder里面维护了一个DataOutStream类,而这个类的stream是kafka自己实现的ByteBufferOutputSteam,这里面有个byteBuffer,也就是说每次append的时候其实都把数据append到了byteBuffer里面了,所以数据都是缓存到了这个byteBuffer里面的。
每次append完了之后都会判断数据是否缓存到位了,到位了就weakup以下Sender,sender线程调用sendProducerData,这里面会调用accumlator.drain方法,这个方法最终会调用batch的close方法,这个close方法会调用recordsBuilder的close方法,这个就是关键了,在close方法里面会把上面缓存的byteBuffer拿出来最终创建成MemoryRecords
然后会转来调用Sender的sendProduceRequest方法准备发送数据了,最终经过辗转几轮其实最后是meoryRecords的writeTo方法将数据写出去的。