kafka原理剖析(1)-producer的启动和初始化

1 核心组件顺序启动
kafka原理剖析(1)-producer的启动和初始化_第1张图片

2 Partitioner
用来决定每个消息路由到哪个分区。是个接口,核心就一个partition方法,返回int是使用哪一个partition。实现类是DefaultPartitioner, 实现了partition,并且用了一个原子自增随机数,

private final AtomicInteger counter = new AtomicInteger(new Random().nextInt());

选择partition的时候有两个情况
(1)如果消息没指定key,则counter+1,根据集群元数据信息,取得所有可用partition,然后counter和partition数量取模,得到使用哪个partition,这个效果就是轮询
kafka原理剖析(1)-producer的启动和初始化_第2张图片
(2)如果指定了key,那么通过工具类对key取hash,得到的int还是和partition个数取模。所以同样的key可以固定发某个partition。

3 Metadata- 元数据组件
从broker集群拉取元数据,包括topic-partitions的情况,每个partition的leader和follower的位置等。
new的时候传入两个重要配置:

retry.backoff.ms:拉取元数据如果失败,间隔多久再去拉,默认100ms,
metadata.max.age.ms:每隔一段时间更新自己的元数据,默认5分钟

随着启动,回去调用update方法,这里只是把我们手动配置的broker地址(bootstrap.servers)设置到了cluster对象,并没有实质的发送请求去拉元数据。为什么这样做?因为元数据可能很多,发消息时用到什么topic再去拉更好,也是延迟加载的一个体现。

4 RecordAccumulator - 消息缓存器
负责消息的接收和缓存,把药发送到每个partition的消息打包成批次batch,每个批次满了发送;或者批次一直没满,到了一定时间必须发送。new的时候传入几个核心参数:

batch.size:批次大小,默认16k
buffer.memory:缓存总大小,默认32m。超过缓存后再发消息默认block60s,maxBlockTimeMs配置
compression.type:压缩类型,gzip这种,默认不压缩。
retry.backoff.ms:失败重试间隔,默认100ms。

(1)核心append方法,发消息的时候用append,目的是追加到partition对应的最后一个批次的最后位置,
(2)append中还包含了申请小块内存(搭配批次),创建批次等内容。

5 NetworkClient - 网络通信组件
封装了网络相关内容,核心就是nio,从参数里封装过的selector就能看出来。核心参数

connections.max.idle.ms 默认值为9分钟,一个网络连接最多空闲多长时间,超过就回收,建议比服务器10分钟小一点。
max.in.flight.requests.per.connection 默认5,该值表示每个网络连接可以忍受的producer端发送给broker消息然后消息没有响应的个数。
reconnect.backoff.ms 连接重连时间
send.buffer.bytes socket发送缓冲区大小,默认是128K
receive.buffer.bytes socket接收数据的缓冲区大小,默认是32K

request.timeout.ms:请求超时时间,默认30s

6 Sender - 数据发送组件
从缓冲区拿数据发。是个线程,持有网络组件NetworkClient和RecordAccumulator,串联缓冲区和网络组件,传入参数:

max.in.flight.requests.per.connection  该参数指定了生产者在收到服务器响应之前可以发送多少个消息。它的值越高,就会占用越多的内存,不过也会提升吞吐量。把它设为 1 可以保证消息是按照发送的顺序写入服务器。设置的多,那么其中有部分batch失败重试的话,就乱序了。
request.timeout.ms:请求超时时间,默认30s
max.request.size 一次请求最多发送多大,根据这个决定发多少个batch。
acks : 0 发送出去就返回,不管成功失败;1 默认,写入leader后返回;-1 isr都写入才返回。
retries : 重试次数

7 总结下初始化涉及到的一些重要参数
(1)metadata

retry.backoff.ms:拉取元数据如果失败,间隔多久再去拉,默认100ms,
metadata.max.age.ms:每隔一段时间更新自己的元数据,默认5分钟

(2)RecordAccumulator

batch.size:批次大小,默认16k
buffer.memory:缓存总大小,默认32m。超过缓存后再发消息默认block60s,maxBlockTimeMs配置
compression.type:压缩类型,gzip这种,默认不压缩。
retry.backoff.ms:失败重试间隔,默认100ms。

(3)Sender:

request.timeout.ms:请求超时时间,默认30s
max.request.size 一次请求最多发送多大,根据这个决定发多少个batch。默认1m,可以大点到10m。
acks : 0 发送出去就返回,不管成功失败;1 默认,写入leader后返回;-1 isr都写入才返回。
retries : 重试次数 

从参数也可以看出来,各自组件负责各自的参数,还是比较明确的。

你可能感兴趣的:(javakafka)