kafka消息消费原理演示
在实际生产过程中,每个topic都会有多个partitions,多个partitions的好处在于,一方面能够对
broker上的数据进行分片有效减少了消息的容量从而提升io性能。另外一方面,为了提高消费端的消费
能力,一般会通过多个consumer去消费同一个topic ,也就是消费端的负载均衡机制,也就是我们接下
来要了解的,在多个partition以及多个consumer的情况下,消费者是如何消费消息的
同时,在上一节课,我们讲了,kafka存在consumer group的概念,也就是group.id一样的
consumer,这些consumer属于一个consumer group,组内的所有消费者协调在一起来消费订阅主题
的所有分区。当然每一个分区只能由同一个消费组内的consumer来消费,那么同一个consumer
group里面的consumer是怎么去分配该消费哪个分区里的数据的呢?如下图所示,3个分区,3个消费
者,那么哪个消费者消分哪个分区?

51cto logstatsh 消费多个 kafka kafka订阅多个topic消费_消息发送

对于上面这个图来说,这3个消费者会分别消费test这个topic 的3个分区,也就是每个consumer消费一
个partition。
代码演示(3个partiton对应3个consumer)
Ø 创建一个带3个分区的topic
Ø 启动3个消费者消费同一个topic,并且这3个consumer属于同一个组
Ø 启动发送者进行消息发送
代码演示(3个partiton对应2个consumer)
//消费指定分区的时候,不需要再订阅
//kafkaConsumer.subscribe(Collections.singletonList(topic));
//消费指定的分区
TopicPartition topicPartition=new TopicPartition(topic,0);
kafkaConsumer.assign(Arrays.asList(topicPartition));
演示结果:consumer1会消费partition0分区、consumer2会消费partition1分区、consumer3会消费
partition2分区
如果是2个consumer消费3个partition呢?会是怎么样的结果?
Ø 基于上面演示的案例的topic不变
Ø 启动2个消费这消费该topic
Ø 启动发送者进行消息发送
演示结果:consumer1会消费partition0/partition1分区、consumer2会消费partition2分区
代码演示(3个partition对应4个或以上consumer)
演示结果:仍然只有3个consumer对应3个partition,其他的consumer无法消费消息
通过这个演示的过程,我希望引出接下来需要了解的kafka的分区分配策略(Partition Assignment
Strategy)

 

consumer和partition的数量建议

1. 如果consumer比partition多,是浪费,因为kafka的设计是在一个partition上是不允许并发的,
所以consumer数不要大于partition数
2. 如果consumer比partition少,一个consumer会对应于多个partitions,这里主要合理分配
consumer数和partition数,否则会导致partition里面的数据被取的不均匀。最好partiton数目是
consumer数目的整数倍,所以partition数目很重要,比如取24,就很容易设定consumer数目
3. 如果consumer从多个partition读到数据,不保证数据间的顺序性,kafka只保证在一个partition
上数据是有序的,但多个partition,根据你读的顺序会有不同
4. 增减consumer,broker,partition会导致rebalance,所以rebalance后consumer对应的
partition会发生变化

 

【思考?】什么时候会触发这个策略呢?

当出现以下几种情况时,kafka会进行一次分区分配操作,也就是kafka consumer的rebalance
1. 同一个consumer group内新增了消费者
2. 消费者离开当前所属的consumer group,比如主动停机或者宕机
3. topic新增了分区(也就是分区数量发生了变化)
kafka consuemr的rebalance机制规定了一个consumer group下的所有consumer如何达成一致来分
配订阅topic的每个分区。而具体如何执行分区策略,就是前面提到过的两种内置的分区策略。而kafka
对于分配策略这块,提供了可插拔的实现方式, 也就是说,除了这两种之外,我们还可以创建自己的分
配机制。