kafka消息是如何分区的?

189 阅读2分钟

1.真正的问题

本质上,其实就是Producer生产的消息要发送到topic的哪个partition分区?

通常一个topic会关联多个partition分区,在生产者发送消息时,需要选择发送消息的目标分区,kafka【源码版本1.1.0】默认采用的分区路由算法是轮询路由和指定Key情况下的哈希路由。(比较简单的代码)

2.具体实现流程

流程图.jpg

2.1.详细步骤

  1. 获取topic的分区列表;
  2. 判断是否指定key,如果指定key,执行3,否则执行4;
  3. 对key进行hash操作,然后对分区数进行mod运算,得到的就是目标分区ID,结束;
  4. 全局会维护一个topic维度的随机数累加器,当前topic累加器值加1;
  5. 获取topic的所有可用分区列表(可用分区,即leader不为null);
  6. 判断是否有可用分区,如果有,执行7,否则执行9;
  7. topic累加器值对可用分区数进行mod运算,得到某个可用分区列表的索引(注,此处不可以直接用作分区ID);
  8. 根据可用分区列表的索引,获取最终的目标分区ID,结束;
  9. topic累加器值对所有分区数进行mod运算,得到的就是目标分区ID,结束;

3.延伸问题

在指定key操作的情况下,是如何进行hash操作的,即采用了什么hash算法?

Murmur哈希算法,一种非加密哈希函数。

优点:速度快,散列效果好。

缺点:非加密的(区别于传统的MD5和SHA哈希算法)。

简单原理:哈希计算过程中,多次进行乘法(Multiply)和旋转(Rotate)。

应用场景:适用于分布式环境中,哈希结果分布更均匀。