Kafka でデータモデリング? トピックとパーティション 質問する

Kafka でデータモデリング? トピックとパーティション 質問する

新しいサービス (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? パーティションについてはどうですか?

どうやって決めればいいのでしょうか?

ベストアンサー1

Kafka 用にデータを構造化する場合、それは実際にそのデータがどのように消費されるかによって異なります。

私の考えでは、トピックとは、同じタイプのコンシューマーによって消費される類似のタイプのメッセージのグループです。そのため、上記の例では、トピックは 1 つだけになります。Kafka を介して他の種類のデータをプッシュすることにした場合は、後で新しいトピックを追加できます。

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

一方、パーティションはメッセージの消費を並列化する方法です。パーティション分割機能を有効にするには、ブローカー クラスター内のパーティションの合計数が、コンシューマー グループ内のコンシューマーの数と少なくとも同じである必要があります。コンシューマー グループ内のコンシューマーは、パーティション分割に従ってトピックの処理の負担をコンシューマー間で分割します。これにより、1 つのコンシューマーは、自身が「割り当てられている」パーティション内のメッセージのみに関係することになります。

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

おすすめ記事