在构建ProducerRecord的时候说过,ProducerRecord除了topic和value外,还有两个可选的,包含partition和key。在拉取到元数据后,咱们就开始依据分区来对这条音讯进行发送。
指定分区
指定分区,就是指 构建ProducerRecord的时候,topic为topic1的ProducerRecord指定partition为1,假设broker此时有3个,别离为broker0、broker1、broker2,那这个音讯将会发送给broker1。
没有key
如果没有指定分区的时候,就会依据分区器进行分区的计算,咱们这里间接用默认的分区器进行分区,所以又分为指定key和没有key的状况。
如果没有指定key的时候,这里也有两种状况:
- topic1对应可用的分区数大于0,那依据topic1对应可用的分区数进行轮询。
- topic1对应可用的分区数等于0,此时依据topic1对应的分区数进行轮询。
轮询的意思就是,这一次发给broker0,下一次发给broker1,再下一次发给broker2,而后再从broker0开始。
指定key
如果指定了key,那kafka就会通过murmur2算法,对key的值进行进行,比方key为a的时候,计算的值为32,这个32会对broker的数量3进行取模,失去的余数为2,此时就会发送给broker2。
这里须要留神的是,这个key曾经是序列化后的key。