Kafka学习之旅(十一): 消费组

前两章讲述比较重要的一个特性就是Kafka 的消费位移 其中包含 位移的含义,位移的发展史 和位移的提交方式。本文接下来继续讲述另外一个特性那就是消费组。
分组消费时Kafka 一个比较具有亮点的一个特性,那什么时消费组呢 大概就是:Kafka 提供的可扩展且具有容错性的消费者机制。那么这里既然提到了组的概念。此时你可能想到这个是一个多个消费者的集合。没错答案就是这样子的。多个消费者共用一个Group Id 构成一个消费组,组内的消费者一起来订阅主题的所有分区当然一个消费者实例只会消费一个分区。
那么为什么要设计这个消费组呢。在传统的消息队列中消息一旦被消费,可能直接就删除了,而且一个只能被一个消费者进行消费。如果想要重新消费或者想要多个消费者消费同一个数据实现起来非常麻烦。而且这种设计十分的不灵活。也会影响数据的真实投递性。如果有这样一个设计 消费组之间各个消费者互相独立,互不影响,能够订阅相同的一组主题又互补干涉。那真是太棒了。
Kafka 仅仅使用Consumer Group 这一种机制,却同时实现了传统消息引擎系统的两大模型:如果所有实例都属于同一个 Group,那么它实现的就是消息队列模型;如果所有实例分别属于不同的 Group,那么它实现的就是发布 / 订阅模型。
这一个消费组中, 理想的情况下消费组的消费者个数和所要消费的分区数是相等的。但是在现实场景中可能会出现一个消费者会出现消费多个分区而又部分消费者没有消费任何分区静静悄悄的在哪里躺着。为什么举个例子, 假设我们又6个分区但是有8个消费者那么就会有两个消费者躺在哪里,要是不发生重平衡的话它两可能一趟就是一辈子。至于什么是重平衡下一篇介绍。那为什么又会有一个消费者消费多个呢假设原先有六个分区,为了避免上述的资源浪费的情况只设置了6个消费者。但是此时有一个消费者挂了那么会发生重平衡此时必然有一个消费者需要消费多个。
那么讲了这么多那么怎么使用呢只需要配置group.id 就好了

public static void main(String[] args) {
        Map map=new HashMap<String,String>();
        map.put("bootstrap.servers","localhost:9092");
        map.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        map.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        map.put("group.id","test1");
        KafkaConsumer kafkaConsumer=new KafkaConsumer(map);
        kafkaConsumer.subscribe(Arrays.asList("test-topic"));
        while (true){
            ConsumerRecords<String, String> consumerRecords=  kafkaConsumer.poll(Duration.ofMillis(1000));
            if(consumerRecords !=null){
                Iterator<ConsumerRecord<String,String>> ite= consumerRecords.iterator();
                while (ite.hasNext()){
                    System.out.println(ite.next().value());
                }
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
发布了213 篇原创文章 · 获赞 35 · 访问量 85万+

猜你喜欢

转载自blog.csdn.net/u012957549/article/details/98447992