web-dev-qa-db-ja.com

Kafka=複数のトピックのコンシューマー

将来的にサイズが増加する可能性のあるトピックのリスト(現在は10)があります。複数のスレッドを(トピックごとに)生成して各トピックから消費できることは知っていますが、私の場合、トピックの数が増加すると、トピックから消費するスレッドの数が増加します。データを頻繁に取得するため、スレッドは理想的な状態になります。

単一の消費者がすべてのトピックから消費する方法はありますか?はいの場合、どのようにそれを達成できますか?また、Kafkaはどのようにオフセットを維持しますか?回答を提案してください。

16
Apollo

次のAPIを使用して複数のトピックをサブスクライブできます:consumer.subscribe(Arrays.asList(topic1、topic2)、ConsumerRebalanceListener obj)

コンシューマーにはトピック情報があり、次のようにOffsetAndMetadataオブジェクトを作成することにより、consumer.commitAsyncまたはconsumer.commitSync()を使用してコミットできます。

ConsumerRecords<String, String> records = consumer.poll(long value);
for (TopicPartition partition : records.partitions()) {
    List<ConsumerRecord<String, String>> partitionRecords = records.records(partition);
    for (ConsumerRecord<String, String> record : partitionRecords) {
        System.out.println(record.offset() + ": " + record.value());
    }
    long lastOffset = partitionRecords.get(partitionRecords.size() - 1).offset();
    consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(lastOffset + 1)));
}
14
Subrata Saha

複数のスレッドは必要ありません。複数のトピックから1つのコンシューマーを消費させることができます。 kafka-server自体はステートレスであるため、オフセットはzookeeperによって維持されます。消費者がメッセージを消費するたびに、そのオフセットはzookeeperでコミットされ、各メッセージを1回だけ処理するために将来の追跡を続けます。したがって、kafkaが失敗した場合でも、コンシューマは最後にコミットされたオフセットの次から消費を開始します。

2
Bhawna Arora