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

指定分区

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

没有key

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

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

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

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

指定key

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

这里须要留神的是,这个key曾经是序列化后的key。