将来的にサイズが増加する可能性のあるトピックのリスト(現在は10)があります。複数のスレッドを(トピックごとに)生成して各トピックから消費できることは知っていますが、私の場合、トピックの数が増加すると、トピックから消費するスレッドの数が増加します。データを頻繁に取得するため、スレッドは理想的な状態になります。
単一の消費者がすべてのトピックから消費する方法はありますか?はいの場合、どのようにそれを達成できますか?また、Kafkaはどのようにオフセットを維持しますか?回答を提案してください。
次の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)));
}
複数のスレッドは必要ありません。複数のトピックから1つのコンシューマーを消費させることができます。 kafka-server自体はステートレスであるため、オフセットはzookeeperによって維持されます。消費者がメッセージを消費するたびに、そのオフセットはzookeeperでコミットされ、各メッセージを1回だけ処理するために将来の追跡を続けます。したがって、kafkaが失敗した場合でも、コンシューマは最後にコミットされたオフセットの次から消費を開始します。