在Kafka的架构中,若没有缓存机制,在RecordAccumulator中对于不再使用的批次对象,需要进行回收,释放这些对象所占用的内存,为了降低GC的压力,Kafka作者设计了一个缓存池的机制,从而实现了实现消息批次的内存复用。本文主要讲解缓冲池的设计。 首先来看下kafka生产者到RecordAccumulator这边的架构流程 生产者发送消息的send方法会依次调用以下方法,首先通过场景驱动的方式来看看生产者的源码是如何通过append()方法将消息添加到batches的双端队列中,首先模拟三个线程(线程一,线程二,线程三)往同一个分区写入数据,执行append操作,假设每次都是线程一先获取到锁,通过synchronized分段加锁,三个线程都能成功的将消息插入batches中,并且成功的将所申请的内存空间释放掉。可以看出append方法为了保证线程的安全性以及并发能力,append方法不是在方法上直接加锁,而是在内部采用分段加锁的方式,进一步提高了并发能力,执行流程图如下 public Future<RecordMetadata>...