在这里插入图片描述

消费者组(consumer group)是kafka提供的可扩展且具有容错性的消费者机制。既然是一个组,那么组内必然可以有多个消费者或消费者实例(consumer instance),它们共享一个公共的ID,即group ID。组内的所有消费者协调在一起来消费订阅主题(subscribed topics)的所有分区(partition),消费者示意图:

单播与多播

单播:一条消息只能被某一个消费者消费的模式称为单播。要实现消息单播,只要让这些消费者属于同一个消费者组即可。
多播:一条消息能够被多个消费者消费的模式称为多播。之所以不称之为广播,是因为一条消息只能被Kafka同一个分组下某一个消费者消费,而不是所有消费者都能消费,所以从严格意义上来讲并不能算是广播模式,当然如果希望实现广播模式只要保证每个消费者均属于不同的消费者组。

实验

  1. 创建topic ,这里创建名为yangcan,副本因子和分区都为1的topic:
    bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic yangcan
  2. 创建两个消费者,开启两个shell终端界面,相当于两个消费者实例,消费yangcan这个topic的数据,同时指定消费组,组名为newGroup:
    bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic yangcan --group newGroup
  3. 向yangcan这个topic生产数据123456789
    在这里插入图片描述
    这时查看消费者,看到两个消费者实例中只有一个消费到了数据:在这里插入图片描述
    在这里插入图片描述
    示意图如下:
    在这里插入图片描述
    总结:当topic的分片数量小于处在同一消费者组内的消费者数量时,会使得消费者组的至少一个消费者消费不到数据,处于闲置。
  4. 这时,修改刚刚创建的topic的分区数量,讲分区数量变为2:
    bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic yangcan --partitions 2
    再次向topic生产数据:
    在这里插入图片描述
    查看两个消费者实例,可以看到两个消费者消费的数据:
    在这里插入图片描述
    在这里插入图片描述

总结:当topic的分片数量等于处在同一消费者组内的消费者数量时,每个消费者都可以消费到部分数据。

  1. 这时,我们关闭其中的一个消费者,重新创建一个消费者,但是指定消费者组名为newGroup1:
    在这里插入图片描述
  2. 再次向topic生产数据,可以看到两个消费者实例:
    在这里插入图片描述
    在这里插入图片描述
    可以看到两个消费者消费到同样的数据,结构示意图如下:
    在这里插入图片描述

总结:当多个消费者组共同消费一个topic时,消费者组之间互不影响,同一条数据会同时被各个消费者组消费。
9. 另外,假设topic有5个分区,其消费者组内只有1个消费者时,用这个消费者订阅这个topic,这时消费者会收到5个分区所有的消息,示意图如下:
在这里插入图片描述

消费者组其他操作

1.查看有哪些消费者组:
bin/kafka-consumer-groups.sh --list --bootstrap-server localhost:9092在这里插入图片描述
2.删除某个消费者组,例删除名为 tt 的消费者组:
bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 --delete --group ttt在这里插入图片描述
3.查看某个消费者组详情:
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group newGroup -describe
在这里插入图片描述
其中CURRENT-OFFSET表示当前消费偏移量,LOG-END-OFFSET表示末尾偏移量。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐