1.真正的问题
本质上,其实就是Producer生产的消息要发送到topic的哪个partition分区?
通常一个topic会关联多个partition分区,在生产者发送消息时,需要选择发送消息的目标分区,kafka【源码版本1.1.0】默认采用的分区路由算法是轮询路由和指定Key情况下的哈希路由。(比较简单的代码)
2.具体实现流程
2.1.详细步骤
- 获取topic的分区列表;
- 判断是否指定key,如果指定key,执行3,否则执行4;
- 对key进行hash操作,然后对分区数进行mod运算,得到的就是目标分区ID,结束;
- 全局会维护一个topic维度的随机数累加器,当前topic累加器值加1;
- 获取topic的所有可用分区列表(可用分区,即leader不为null);
- 判断是否有可用分区,如果有,执行7,否则执行9;
- topic累加器值对可用分区数进行mod运算,得到某个可用分区列表的索引(注,此处不可以直接用作分区ID);
- 根据可用分区列表的索引,获取最终的目标分区ID,结束;
- topic累加器值对所有分区数进行mod运算,得到的就是目标分区ID,结束;
3.延伸问题
在指定key操作的情况下,是如何进行hash操作的,即采用了什么hash算法?
Murmur哈希算法,一种非加密哈希函数。
优点:速度快,散列效果好。
缺点:非加密的(区别于传统的MD5和SHA哈希算法)。
简单原理:哈希计算过程中,多次进行乘法(Multiply)和旋转(Rotate)。
应用场景:适用于分布式环境中,哈希结果分布更均匀。