一、生产者分区
分区的目的在于可以提高并发,并在可在集群中扩展以适应不同大小的数据
producer发送的数据会被封装成Producer Recorder对象
- 在生成Producer Recorder对象时指明partition的情况下,直接进入对应的partition分区
- 没有指明partition值,但有key值,将key的hash值与topic的分区数进行取余,进入对应的分区
- 没有partition和key值,则随机生成一个整数(后面每次调用在该整数基础上自增),将该整数和topic的分区数取余,进入对应分区
二、消费者分区
消费者分区有两种策略,分别为Range和RoundRobin,默认策略是Range
- Range是首先对同一个Topic里面的分区按照序号进行排序,并对消费者按照字母顺序进行排序。然后用Partitions分区的个数除以消费者线程的总数来决定每个消费者线程消费几个分区。如果除不尽,那么前面几个消费者线程将会多消费一个分区。
例如:我们有10个分区,两个消费者(C1,C2),3个消费者线程,10 / 3 = 3而且除不尽。
C1-0 将消费 0, 1, 2, 3 分区
C2-0 将消费 4, 5, 6 分区
C2-1 将消费 7, 8, 9 分区 - RoundRobin 第一步:将所有主题分区组成TopicAndPartition列表,然后对TopicAndPartition列表按照hashCode进行排序,最后按照轮询的方式发给每一个消费线程,
例如:我们有10个分区,两个消费者(C1,C2),3个消费者线程
C1-0 将消费 0, 3, 6, 9 分区
C2-0 将消费 1, 4, 7 分区
C2-1 将消费 2, 5, 8 分区