在构建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


大军
847 声望183 粉丝

学而不思则罔,思而不学则殆