Apache Kafka 0.10.1.0の新規インストールを行いました。
コマンドプロンプトでメッセージを送受信できました。
Producer/Consumer Java Exampleを使用している間、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
消費者は自身に消費者グループ名のラベルを付け、トピックに発行された各レコードは、サブスクライブしている各消費者グループ内の1つの消費者インスタンスに配信されます。コンシューマインスタンスは、別々のプロセスまたは別々のマシンに存在できます。
すべてのコンシューマーインスタンスが同じコンシューマーグループを持っている場合、レコードはコンシューマーインスタンス間で効果的に負荷分散されます。
すべてのコンシューマインスタンスに異なるコンシューマグループがある場合、各レコードはすべてのコンシューマプロセスにブロードキャストされます。
Group.idは、このコンシューマが属するコンシューマプロセスのグループを一意に識別する文字列です。
( Kafkaイントロ )
グループIDにランダムな値を与えます。関係ありません。
props.put("group.id", "Any Random Value");
指定したコードでは、100ミリ秒間データを1回待機するだけです。ループでデータを受信するか、より長い時間待機する必要があります(この場合、データの一部のみを取得します)。 「group.id」に関しては、コンソールからコンシューマを実行した場合、ランダムな「group.id」が取得されます。
パーティションとコンシューマープロパティ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の場合、2つのアクティブな消費者のうち1つだけがデータを取得します
partition = 2および総消費者数= 2の場合、2つのアクティブな消費者のそれぞれが均等にデータを取得します
partition = 3および総消費者数= 2の場合、2つのアクティブな消費者のそれぞれがデータを取得します。 1人の消費者は2つのパーティションからデータを取得し、他の消費者は1つのパーティションからデータを取得します。
partition = 3で総消費者数= 3の場合、3つのアクティブな消費者のそれぞれが均等にデータを取得します。
オフセットが提供されていないため、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);
}