分区的目的
1.方便扩展:每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;
2.提高并发:以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。
分区的原则
我们需要将producer发送的数据封装成一个ProducerRecord****对象。
- 如果发送数据的时候指定了partition,那么直接就将数据发送到对应的partition
- 如果发送数据的时候没有指定partition,但是指定了key,那么就将key的hash值取模与topic的partition数量(如果这个topic总共有三个partition,那么就是3)进行取余就可以得到partition的值,然后就往这个partiton写数据.
- 既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,把数据存到这个partition分区,也就是常说的 round-robin 算法。