私はこの主題に関するいくつかの明確化を探しています。 Kafka documentationsで私は以下を見つけました:
Kafkaは、トピック内の異なるパーティション間ではなく、パーティション内のメッセージの全体的な順序のみを提供します。ほとんどのアプリケーションでは、キーごとにデータをパーティション化する機能と組み合わせたパーティションごとの順序で十分です。ただし、メッセージ全体の注文が必要な場合は、パーティションが1つしかないトピックでこれを実現できますが、これはコンシューマグループごとに1つのコンシューマプロセスのみを意味します。
だからここに私の質問があります:
(同じグループの)複数のコンシューマーに複数のパーティションが必要な1つのトピックを読んでもらいたいということですか?
同じグループのコンシューマーの量と同じ量のパーティションが必要ということですか?
1つのパーティションから何人のコンシューマーを読み取ることができますか?
また、APIに関するキーとパーティションの関係についても質問があります。私は.net API(特にMSのAPI)だけを見ましたが、まねたJava API。消費者がトピックから読み取る場合、パーティション番号があります。
前もって感謝します。
イゴール、
パーティションは、Kafkaトピックの並列性を高めます。任意の数のコンシューマ/プロデューサが同じパーティションを使用できます。プロトコルを定義するアプリケーション層まで。 Kafkaは配信を保証します。 APIについては、Javaドキュメントがより完全な場合があるため、参照することをお勧めします。私の経験に基づいて:
(同じグループの)複数のコンシューマーに複数のパーティションが必要な1つのトピックを読んでもらいたいということですか?
Kafkaの次のプロパティを見てみましょう。
これらのプロパティにより、kafka=は、コンシューマプロセスのプールでordering guarantees
とload balancing
の両方をスマートに提供できます。
質問に答えるには、はい、同じグループのコンテキストで、N consumers
が必要な場合は、at least N partitions
が必要です。
同じグループのコンシューマーの量と同じ量のパーティションが必要ということですか?
これは最初の答えで説明されたと思います。
1つのパーティションから何人のコンシューマーを読み取ることができますか?
1つのパーティションから読み取ることができるnumber of consumers
は、そのトピックにサブスクライブしているnumber of consumer groups
と常に同じです。
APIに関するキーとパーティションの関係
まず、producer
がトピック内のどのパーティションにどのレコードを割り当てるかを選択する責任があることを理解する必要があります。
ここで、プロデューサーがどのように行うかを見てみましょう。まず、ProducerRecord.Java
のクラス定義を見てみましょう:
public class ProducerRecord<K, V> {
private final String topic;
private final Integer partition;
private final Headers headers;
private final K key;
private final V value;
private final Long timestamp;
}
ここで、クラスから理解する必要があるフィールドはpartition
です。
ドキュメントから、
partition number
が指定されている場合、そのpartition
はレコードの送信時に使用されます。key
が存在する場合、hash of the key
を使用してパーティションが選択されます。key
もpartition
も存在しない場合、パーティションはround-robin fashion
に割り当てられます。