1. ホーム
  2. apache-kafka

[解決済み】Kafkaのトピックとパーティションを理解する

2022-04-20 11:43:37

質問

私はKafkaを学び始めていますが、読書中にいくつかの疑問が浮かんできました。

  1. プロデューサーがメッセージを生成するとき、そのメッセージには トピック に送りたいということですね?パーティションは気になりますか?

  2. サブスクライバの実行時に、グループ ID を指定して、同じトピックまたはこのグループのコンシューマが関心を持つ複数のトピックのコンシューマのクラスタの一部になれるようにするか。

  3. 各コンシューマーグループはブローカー上に対応するパーティションを持っていますか、それとも各コンシューマーが1つずつ持っていますか?

  4. パーティションはブローカーが作成するため、コンシューマーには関係ないのでしょうか?

  5. これは各パーティションにオフセットがあるキューなので、どのメッセージを読みたいかを指定するのはコンシューマの責任でしょうか?また、その状態を保存する必要がありますか?

  6. メッセージがキューから削除された場合、どうなりますか?- 例えば、リテンションが3時間で、その後時間が経過した場合、双方でどのようにオフセットが処理されるのでしょうか?

どのように解決するのですか?

<ブロッククオート

この投稿にはすでに答えがありますが、Kafka Definitive Guideからいくつかの写真を使って私の見解を追加します。

質問に答える前に、プロデューサーのコンポーネントの概要を見てみましょう。

1. プロデューサーがメッセージを作成するとき - メッセージを送信したいトピックを指定します。パーティションは気になりますか?

プロデューサーは、メッセージの配置先パーティションを決定します。

  • パーティションID(メッセージ内で指定されている場合
  • キー % num パーティション パーティションIDが指定されていない場合
  • どちらでもない場合はラウンドロビン パーティションID また メッセージキー がメッセージ内で利用可能な場合は、値のみが利用可能であることを意味します。
<ブロッククオート

2. サブスクライバが実行されるとき - 同じトピックまたはこのグループの消費者が関心を持ついくつかのトピックの消費者のクラスタの一部になれるように、そのグループIDを指定していますか?

を常に設定する必要があります。 group.id ただし、単純な割り当てAPIを使用していて、Kafkaにオフセットを保存する必要がない場合は除きます。どのグループにも属さないことになります。 ソース

<ブロッククオート

3. 各コンシューマーグループはブローカー上で対応するパーティションを持っていますか、それとも各コンシューマーが1つずつ持っていますか?

1つのコンシューマーグループにおいて、各パーティションは1つのコンシューマーによってのみ処理される . 以下のようなシナリオが考えられます。

  • 消費者の数は 未満 トピックパーティションの数であれば、複数のパーティションをグループ内の消費者のいずれかに割り当てることができます。
  • コンシューマー数 同じ をトピックパーティションの数で割ると、パーティションとコンシューマのマッピングは以下のようになります。
  • 消費者の数は よりも高い の場合、パーティションとコンシューマのマッピングは以下のようになります。 効果なし、消費者5を確認

4. ブローカーによって作成されたパーティションとして、したがって、消費者のための懸念ではない?

消費者が認識すべきこと 質問3で議論したように、パーティション数について。

5. これはパーティションごとにオフセットを持つキューなので、どのメッセージを読みたいかを指定するのはコンシューマの責任でしょうか?また、その状態を保存する必要がありますか?

カフカ(具体的には グループコーディネーター へのメッセージを生成し、オフセットの状態を管理します。 __consumer_offsets トピックで、この動作を手動に設定することもできます。 enable.auto.commitfalse . その場合 consumer.commitSync()consumer.commitAsync() は、オフセットの管理に役立ちます。

詳細はこちら グループコーディネーター :

  1. Kafkaサーバー側から見て、クラスタ内で選出されたブローカーの1つです。
  2. コンシューマーは、オフセットコミットやフェッチリクエストのためにグループコーディネーターと対話します。
  3. コンシューマは、グループコーディネータに定期的にハートビートを送信します。
<ブロッククオート

6. メッセージがキューから削除された場合、どうなりますか?- 例えば、3時間保持した後、時間が経過した場合、双方でどのようにオフセットが処理されるのでしょうか?

保持期間後にコンシューマが開始された場合、メッセージは次のように消費されます。 auto.offset.reset を設定することができます。 latest/earliest 技術的には latest (新しいメッセージの処理を開始する) なぜなら、その時間までにすべてのメッセージが期限切れになってしまい 保持 はトピックレベルの設定です。