私は最近 Kafka を使用していますが、消費者グループの消費者に関して少し混乱しています。混乱の中心は、コンシューマーをプロセスとして実装するかスレッドとして実装するかです。この質問では、高レベルのコンシューマーを使用していると仮定します。
私が実験したシナリオを考えてみましょう。私のトピックには 2 つのパーティションがあります (簡単にするために、レプリケーション ファクターが 1 であると仮定します)。groupでconsumer ( ConsumerConnector
) プロセスを作成し、次にサイズ 2 のトピック カウント マップを作成し、そのプロセスの下で2 つのコンシューマー スレッドを生成しました。パーティションを消費しているようで、パーティションを消費しています。この動作は常に決定論的ですか? 以下はコードスニペットです。Classは、私のコンシューマ スレッド クラスです。consumer1
group1
consumer1_thread1
consumer1_thread2
consumer1_thread1
0
consumer1_thread2
1
TestConsumer
...
Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
topicCountMap.put(topic, new Integer(2));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);
executor = Executors.newFixedThreadPool(2);
int threadNumber = 0;
for (final KafkaStream stream : streams) {
executor.submit(new TestConsumer(stream, threadNumber));
threadNumber++;
}
...
consumer1
ここで、2 つのコンシューマー プロセスを開始し、consumer2
両方が同じグループgroup1
を持ち、それぞれがシングル スレッド プロセスである別のシナリオ (私は実験していませんが、興味があります) を考えてみましょう。今私の質問は次のとおりです。
この場合、2 つの独立したコンシューマー プロセス (同じグループの下にあるにもかかわらず) は、どのようにパーティションに関連付けられますか? 上記のシングル プロセス マルチスレッド シナリオとの違いは何ですか?
一般に、コンシューマー スレッドまたはプロセスは、トピック内のパーティションにどのようにマップまたは関連していますか?
Kafka のドキュメントには、コンシューマー グループの下の各コンシューマーが 1 つのパーティションを消費すると書かれています。ただし、それは消費者スレッド (上記のコード例のように) または独立した消費者プロセスを指しますか?
消費者をプロセスとスレッドとして実装することに関して、ここで見逃している微妙なことはありますか? 前もって感謝します。