在构建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。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。