了解消费者群体ID

时间:2016-12-29 09:23:23

标签: apache-kafka kafka-consumer-api

我做了Apache Kafka 0.10.1.0的全新安装。

我能够在命令提示符下发送/接收消息。

在使用Producer / Consumer Java示例时,我无法知道Consumer Example上的 group.id 参数。

请告诉我如何解决此问题。

以下是我使用的消费者示例:

public static void main(String[] args) {
             Properties props = new Properties();
             props.put("bootstrap.servers", "localhost:9092");
             props.put("group.id", "my-topic");
             props.put("enable.auto.commit", "true");
             props.put("auto.commit.interval.ms", "1000");
             props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
             props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
             KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
             try {
                 consumer.subscribe(Arrays.asList("my-topic"));

                     ConsumerRecords<String, String> records = consumer.poll(100);
                     System.err.println("records size=>"+records.count());
                     for (ConsumerRecord<String, String> record : records) 
                         System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());



              }
             catch (Exception ex){
                 ex.printStackTrace();
             }
            finally {
                 consumer.close();
            }
        }

在为消费者运行命令后,我可以看到生产者发布的消息(在控制台上)。但无法从java程序中看到消息

  

bin \ windows \ kafka-console-consumer.bat --bootstrap-server localhost:9092 - topic my-topic --from-beginning

6 个答案:

答案 0 :(得分:16)

  

消费者使用消费者群组名称和每条记录标记自己   发布到主题的内容将传递给每个主题中的一个消费者实例   订阅消费者群体。消费者实例可以分开   流程或在不同的机器上。

     

如果所有的消费者实例都有相同的消费者群体,那么   记录将有效地在消费者实例上进行负载平衡。

     

如果所有消费者实例都有不同的消费者群体,那么   每条记录都将广播给所有消费者流程。

group.id是一个字符串,用于唯一标识此使用者所属的使用者进程组。

Kafka intro

答案 1 :(得分:3)

为组ID提供任意随机值。没关系。

props.put("group.id", "Any Random Value");

答案 2 :(得分:0)

在您提供的代码中,您只需等待100ms的数据。 您应该循环接收数据或等待更长的时间(在这种情况下,您只能获得一部分数据)。 至于&#39; group.id&#39;如果您从控制台运行消费者,它会随机发生&#39; group.id&#39;。

答案 3 :(得分:0)

由于没有提供偏移量,java客户端将等待新消息,但不会显示现有消息 - 这是预期的。如果打算阅读主题中已有的所有消息,可以使用这段代码:

if (READ_FROM_BEGINNING) {
    //consume all the messages from the topic from the beginning.
    //this doesn't work reliably if it consumer.poll(..) is not called first 
    //probably because of lazy-loading issues            
    consumer.poll(10);
    consumer.seekToBeginning(consumer.assignment()); //if intending to 
    //read from the beginning or call below to read from a predefined offset.
    //consumer.seek(consumer.assignment().iterator().next(), READ_FROM_OFFSET);
}

答案 4 :(得分:0)

以下是分区和消费者属性group.id

的一些测试结果
 Properties props = new Properties();
  //set all other properties as required
  props.put("group.id", "ConsumerGroup1");
  props.put("max.poll.records", "1");
  KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);

consumer.group id是对生成的数据进行负载均衡(如果每个消费者的group.id不同,则每个消费者都会获得数据副本)

如果partition = 1且消费者总数= 2,则两个活跃消费者中只有一个会获得数据

如果partition = 2且消费者总数= 2,则两个活跃消费者中的每一个均匀获得数据

如果partition = 3且消费者总数= 2,则两个活跃消费者中的每一个都将获得数据。一个消费者从2个分区获取数据,而另一个消费者从1个分区获取数据。

如果partition = 3且消费者总数= 3,则三个活跃消费者中的每一个均匀获取数据。

答案 5 :(得分:-1)

使用者组ID使用者组,应在Kafka Consumer.properties文件中定义。

一定要将“我的主题”添加到消费者组中,并且应该如下所示:

# consumer group id
group.id=my-topic-consumer-group