web-dev-qa-db-ja.com

消費者グループIDを理解する

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

14
Ankit

消費者は自身に消費者グループ名のラベルを付け、トピックに発行された各レコードは、サブスクライブしている各消費者グループ内の1つの消費者インスタンスに配信されます。コンシューマインスタンスは、別々のプロセスまたは別々のマシンに存在できます。

すべてのコンシューマーインスタンスが同じコンシューマーグループを持っている場合、レコードはコンシューマーインスタンス間で効果的に負荷分散されます。

すべてのコンシューマインスタンスに異なるコンシューマグループがある場合、各レコードはすべてのコンシューマプロセスにブロードキャストされます。

Group.idは、このコンシューマが属するコンシューマプロセスのグループを一意に識別する文字列です。

Kafkaイントロ

19
Raz Omessi

グループIDにランダムな値を与えます。関係ありません。

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

指定したコードでは、100ミリ秒間データを1回待機するだけです。ループでデータを受信するか、より長い時間待機する必要があります(この場合、データの一部のみを取得します)。 「group.id」に関しては、コンソールからコンシューマを実行した場合、ランダムな「group.id」が取得されます。

0
guest

パーティションとコンシューマープロパティ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つのアクティブな消費者のそれぞれが均等にデータを取得します。

0
Beginner

オフセットが提供されていないため、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);
}
0
jazz