我做了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
答案 0 :(得分:16)
消费者使用消费者群组名称和每条记录标记自己 发布到主题的内容将传递给每个主题中的一个消费者实例 订阅消费者群体。消费者实例可以分开 流程或在不同的机器上。
如果所有的消费者实例都有相同的消费者群体,那么 记录将有效地在消费者实例上进行负载平衡。
如果所有消费者实例都有不同的消费者群体,那么 每条记录都将广播给所有消费者流程。
group.id是一个字符串,用于唯一标识此使用者所属的使用者进程组。
答案 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