Kafka源码解读—-key为nulll时Kafka如何选择分区(Partition)

Kafka 天涯孤鸟 9789℃ 0评论

我们都知道,kafka producer发送消息的时候,可以指定key,这个key的作用是为消息选择存储分区,key可以为空,当指定key且不为空的时候,kafka是根据key的hash值与分区数取模来决定数据存储到那个分区,那么当key为null的时候,kafka又是如何存储的呢?可能很多人都会说随机选择一个分区进行存储,但是具体是怎么实现的呢?虽然可以这么说,但是还不够严谨,下面通过kafka的源码来解读下key=null是怎么存储的:

从上面源码可以看出,当key=null时,kafka是先从缓存中取分区号,然后判断缓存的值是否为空,如果不为空,就将消息存到这个分区,否则重新计算要存储的分区,并将分区号缓存起来,供下次使用。那么这个缓存时间是由什么决定呢,再来看下源码:

从上面源码可以看出,kafka定义了一个全局变量,这个变量值是配置参数中的topic.metadata.refresh.interval.ms设置的值,也就是说在这个时间内,key=null的消息都会往缓存起来的这个分区存储,当时缓存过时之后,就会重新计算分区号,将计算结果缓存起来。也就是说在key为null的情况下,Kafka并不是每条消息都随机选择一个Partition;而是每隔topic.metadata.refresh.interval.ms才会随机选择一次!

下面附上源码地址:
https://github.com/apache/kafka/blob/0.8.1/core/src/main/scala/kafka/producer/DefaultPartitioner.scala—–分区号计算源码
https://github.com/apache/kafka/blob/0.8.1/core/src/main/scala/kafka/producer/async/DefaultEventHandler.scala—–key=null分区选择源码
https://github.com/apache/kafka/blob/0.8.1/core/src/main/scala/kafka/producer/ProducerConfig.scala——分号缓存时间配置源码


转载请注明:猫头鹰工作室 » Kafka源码解读—-key为nulll时Kafka如何选择分区(Partition)

喜欢 (0)or分享 (0)
Avatar
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址