1. ホーム
  2. apache-kafka

[解決済み] Kafkaでデータモデリング?トピックとパーティション

2022-04-29 20:47:48

質問

新しいサービス(非RDBMSデータストアやメッセージキューなど)を使うときに最初に考えることの1つは、「どのようにデータを構造化すればよいのか」ということです。

入門用の資料を読んだり、見たりしました。特に、例えば Kafka: ログ処理のための分散型メッセージングシステム と書いている。

  • トピックは、メッセージが関連付けられるコンテナです。
  • 並列性の最小単位は、トピックのパーティションです。これは、...トピックの特定のパーティションに属するすべてのメッセージは、コンシューマーグループのコンシューマーによって消費されることを意味します"

では、トピックとパーティションの使い方を説明する良い例は何でしょうか?どのような場合にトピックとなるのでしょうか?また、どのような場合にパーティションとなるのでしょうか?

例として、私の(Clojureの)データが以下のようなものだとします。

{:user-id 101 :viewed "/page1.html" :at #inst "2013-04-12T23:20:50.22Z"}
{:user-id 102 :viewed "/page2.html" :at #inst "2013-04-12T23:20:55.50Z"}

トピックは user-id ? viewed ? at ? パーティションはどうする?

どのように決めればいいのですか?

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

Kafkaのためにデータを構造化するとき、それがどのように消費されることを意図しているかに本当に依存します。

私の考えでは、トピックとは、同じタイプのコンシューマによって消費される、似たようなタイプのメッセージのグループ化である。

トピックはZooKeeperに登録されるため、例えば100万人のユーザーを抱え、ユーザーごとにトピックを作成する場合、あまりに多くのトピックを追加しようとすると問題が発生する可能性がある。

一方、パーティションは、メッセージの消費を並列化するための方法です。 パーティショニング機能を利用するためには、ブローカークラスタ内のパーティションの総数が、少なくともコンシューマグループ内のコンシューマの数と同じである必要があります。 コンシューマ・グループ内のコンシューマは、パーティショニングに従ってトピックの処理負担を互いに分担し、あるコンシューマは自身が割り当てられたパーティション内のメッセージにのみ関与することになります。

パーティショニングは、プロデューサー側でパーティション・キーを使って明示的に設定することもできますし、設定されていない場合は、メッセージごとにランダムなパーティションが選択されます。