6

kafka -- 分区是怎么指定的

 2 years ago
source link: https://segmentfault.com/a/1190000040773987
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在构建ProducerRecord的时候说过,ProducerRecord除了topic和value外,还有两个可选的,包括partition和key。在拉取到元数据后,我们就开始根据分区来对这条消息进行发送。

指定分区,就是指 构建ProducerRecord的时候,topic为topic1的ProducerRecord指定partition为1,假定broker此时有3个,分别为broker0、broker1、broker2,那这个消息将会发送给broker1。

image.png

没有key

如果没有指定分区的时候,就会根据分区器进行分区的计算,我们这里直接用默认的分区器进行分区,所以又分为指定key和没有key的情况。

如果没有指定key的时候,这里也有两种情况:

  1. topic1对应可用的分区数大于0,那根据topic1对应可用的分区数进行轮询。
  2. topic1对应可用的分区数等于0,此时根据topic1对应的分区数进行轮询。

轮询的意思就是,这一次发给broker0,下一次发给broker1,再下一次发给broker2,然后再从broker0开始。

image.png

指定key

如果指定了key,那kafka就会通过murmur2算法,对key的值进行进行,比如key为a的时候,计算的值为32,这个32会对broker的数量3进行取模,得到的余数为2,此时就会发送给broker2。

这里需要注意的是,这个key已经是序列化后的key。

image.png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK