Kafka源码解析(七)- 发送数据流程(5)

本篇介绍下Kafka是如何将消息压入RecordAccumulator对象中的

RecordAccumulator 中的append方法,点进去

步骤一:getOrCreateDeque,获取或创建队列,kafka设计上将发往同一个分区的数据封装成RecordBatch对象,然后将这些对象放入一个队列中,再由 ConcurrentMap<TopicPartition, Deque> batches;
batches这个数据结构维护着这些队列。那么首先要根据分区对象获取对应的队列。如果代码第一次进来,是没有这个分区对应的队列的,那么就要创建好,并存入batches中。

步骤二:tryAppend,尝试将数据存入批次,这里为什么是“尝试”呢?,点进去看一下。

从队列里面获取批次,代码第一次进来的时候,也是没有批次的,所以返回null。

步骤三:计算批次大小,根据批次大小申请内存。这里面批次大小是:在初始化时候设置的默认参数和消息大小之间取最大值,初始化的时候是默认16k。
如果消息大小大于16k了,那就相当于一条消息一个批次,那么批次的概念就没有意义了,所以在使用kafka的时候,消息如果很大,要修改batch.size这个参数
申请完内存以后,再次tryAppend,尝试将数据存入批次,当然代码第一次进来,还是失败的,返回null。

步骤四:封装批次对象,将数据存入批次中

由于是代码第一次进来,队列、批次对象都没有,所以tryAppend了三次,才把数据存入批次对象中。如果第二次进来,且分区对象已经被前面的消息创建好了,那么直接将数据存进去就完事了。

posted @ 2020-11-02 22:55  写写代码睡着了  阅读(31)  评论(0)    收藏  举报