分区的原则

我们需要将producer发送的数据封装成一个ProducerRecord对象。

image.png

  1. 如果发送数据的时候指定了partition,那么直接就将数据发送到对应的partition

  2. 如果发送数据的时候没有指定partition,但是指定了key,那么就将key的hash值取模与topic的partition数量(如果这个topic总共有三个partition,那么就是3)进行取余就可以得到partition的值,然后就往这个partiton写数据.

hash(key)/(partition数量)

  1. 既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,把数据存到这个partition分区,也就是常说的 round-robin (轮询)算法。