Bootstrap

Kafka 源码学习

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 端
在这里插入图片描述

五 Kafka 一些调优参数

1. kafka 消息缓存大于 1M 会报错 超 32M 报错

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;