Kafka源码解析(一)- 初始化生产者
kafka版本:0.10.1.0
将kafka源码下载下来导入idea后都会看到一个examples包,这个包里面有生产者和消费者的例子,教我们如何使用,个人认为这里面的例子是我们学习源码最好的入口。


这段代码主要做了三件事:
1、初始化分区器
2、读取用户配置的retry.backoff.ms 这个参数的值。这个参数是重试时间间隔 默认100ms,一般我们在使用kafka的时候为了避免消息丢失,都会设置这个重试时间间隔
3、初始化key,value序列化器,一般我们用kafka自带的就可以
props.put("key.serializer", "org.apache.kafka.common.serialization.IntegerSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

这里面主要初始化了:
1、Metadata对象,这个是kafka元数据的对象,里面有许多数据结构
2、max.request.size 这个参数代表允许发送的数据最大的大小,默认1M,如果生产上发送的数据比较大,超过了1M,就需要去设置这个值
3、totalMemorySize 缓存大小,后面重点解释

这里面初始化了两个核心组件:
1、RecordAccumulator 这个组件是kafka0.8版本以后才有的,是支持批量发送的核心设计,也是保证kafka高吞吐的重要设计之一
2、NetworkClient 管理kafka网络的组件
这里面有个参数我们在使用kafka的时候要注意max.in.flight.requests.per.connection:这个参数代表一个网络连接允许最多有多少条消息发送至服务端,但没有收到响应,默认是5 一般情况下,我们在发送数据没有收到响应的情况下会去重
试,也就是说允许最多进入重试的消息个数是5个,并且每个消息重试都会有一个时间间隔。
值得注意的是:如果这个参数不去设置,可能会造成消息乱序,因为这5个消息重试成功的顺序没法保证。比如正常发送的顺序是1-2-3-4-5,且都进入了重试,最终不一定谁先重试成功
所以要保证消息的有序性,要把这个参数设置成1,只允许一条消息进入重试

这里面主要初始化了sender线程,并把它启动起来了,里面有两个参数重点解释一下:
1、retries: 消息发送不成功的重试次数,默认是0,就是不重试,一般我们在使用的时候会去设置这个值
2、acks:默认是1,这个参数可以有三个值 0 ,1 ,-1
0 的情况代表生产者向服务端发送数据的时候,无论发送成功与否都不管了,这种是吞吐量最大的做法,但是可能丢数据
1 的情况代表生产者将数据写入topic的leader partition中就算成功了,这种做法也可能丢数据,就是在写入leader partition之后,follower partition还没来得及复制数据,leader partition所在的机器挂了,数据就丢了
-1 的情况代表生产者将数据写入leader partition后,要等到follower partition 将数据同步完成才给出响应,这种做法是最安全的,但是同时性能也是最差的
附上初始化生产者流程中,初始化的几个重要组件

至此,初始化生产者流程已结束

浙公网安备 33010602011771号