文章目录
Kafka 源码剖析
一 Kafka客户端发送消息的核心流程
线程:
Kafka 客户端总共两个线程, 一个主线程,一个 sender 线程。 获取元数据也是由 Sender 线程完成的
1 同步等待拉取元数据
2 对消息 KV 进行序列号
3 根据分区选择消息应该发送的分区
不传分区则算法选择 – 遍历选择分区
4 确认消息大小是否超过阈值
5 根据元数据信息,封装分区对象
6 给每条消息绑定它的回调函数
7 把消息放入缓存,封装批次(检查两次 默认 1M 一次,内置 32M 一次)
8 唤醒 sender 线程 (并未休眠,单纯踢它一脚,就是玩)
sender 流程
遍历所有分区,得到所有批次,判断批次是否需要发送
一个批次默认 16K
如果目前写入 10K 并未写满,也会发送出去。 因默认 lingerMS 默认值为0 需要修改
建议修改 100MS timeToWaitMS =linerMs = 100ms # 等待 MS 必须发送
批次默认数据也应该调优,根据公司业务数据来定,设置过大也将浪费内存空间
发送判断条件
1 批次写满
2 linerMs 时间到
3 内存不够,立即发送
二 Kafka 内存池
个性化内存池
个性化内存池 比如 1M 一直写不满 就会浪费资源
三 Kafka 拉取元数据流程
四 Kafka 核心
生产者与消费者对于 Kafka 来讲都属于客户端
所以核心代码在 client 端