kafka数据分区策略包括,轮询分区,随机分区,还有一些其他的分区策略,作为使用者,我们就不去深入探究了

轮询策略

也称 Round-robin 策略,即顺序分配。比如一个主题下有 3 个分区,那么第一条消息被发送到分区 0,第二条被发送到分区 1,第三条被发送到分区 2,以此类推。当生产第 4 条消息时又会重新开始,即将其分配到分区 0,就像下面这张图展示的那样。

kafka总一个broker可以连接多个消费者 kafka一个分区多个消费者_kafka

随机策略

也称 Randomness 策略。所谓随机就是我们随意地将消息放置到任意一个分区上,如下面这张图所示。

kafka总一个broker可以连接多个消费者 kafka一个分区多个消费者_数据_02

其中轮询分区是使用最多的分区方式。无论哪种分区策略都说明了每个分区中只能保存一部分的数据。

一个消费者组中可以有多个消费者,我们已经知道每个消费者组都可以消费到全部的数据,但是如果同一个消费者组中有多个消费者,消息是怎么消费的呢?

我们来做一个实验:

创建一个topic和producer默认分区是2:

sh /home/kafka/kafka_2.12-3.1.0/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test2

创建一个消费者:

sh /home/kafka/kafka_2.12-3.1.0/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer-property group.id=group_mytes

然后发送几条消息,如下图,左边是发送的消息,右边是接收的消息。

不出意料的,消费者能够接收到所有的消息

kafka总一个broker可以连接多个消费者 kafka一个分区多个消费者_kafka_03

kafka总一个broker可以连接多个消费者 kafka一个分区多个消费者_bootstrap_04

 

 如果我们在这个消费者组中再创建一个消费者,需要把上面的命令再执行以便即可,那么可以得到下面的结果

kafka总一个broker可以连接多个消费者 kafka一个分区多个消费者_bootstrap_05

kafka总一个broker可以连接多个消费者 kafka一个分区多个消费者_分布式_06

 

 可以看到每个消费者只消费到了一部分数据。

那如果再增加一个消费者呢?

会出现两个消费者消费的数据和上面相同,而另一个消费者完全没有数据的情况下,这是因为一共只有2个分区,每个消费者消费一个分区,必然多出一个消费者没有分配到分区的情况下。