KafkaProducer只用一个Send()方法,就可以实现同步/异步处理数据的,Send()返回一个Future对象,基于Future来实现同步/异步。
同步:即返回Future对象后,立即调用get,阻塞等待结果
异步:提供Callback函数,Send()执行完,无需等待,服务器完成数据处理后,回调Callback函数。
而RecordAccumulator作为KafkaProducer的核心类之一,主要是为了提高KafkaProducer的吞吐量,KafkaProducer与Broker之间持有TCP长链接,批量发送数据。即待发送的数据先缓存在RecordAccumulator中,待一定时机,由Sender线程发送到服务器端。
RecordAccumulator中核心成员变量是 ConcurrentMap
我们知道Kafka的最小并发单位是Partition,Partition分为主备(leader/replica)。而只有LeaderPartition有读写能力,ReplicaPartition仅仅是为了高可用,不与client端交互(Producer/Consumer)。
因此为了提高Producer的吞吐量,Producer与每个LeaderPartition(当然是有待向该Partition发送数据)所在的Broker都有TCP长链接,通过该长链接批量发送数据。
这样以TopicPartition为Key,Sender在RecordAccumulator中获取发送数据时,会根据TopicPartition找到其Leader所在Broker,转换为 Map



