180

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

いくつかの紹介資料を読み、見ました。特に、たとえばKafka: a Distributed Messaging System for Log Processingを取り上げると、次のように書かれています。

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

これを知った上で、トピックとパーティションの使用方法を示す良い例は何でしょうか? 何かをいつトピックにする必要がありますか? 何かをいつパーティションにする必要がありますか?

例として、私の (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? パーティションはどうですか?

どうやって決めるの?

4

4 に答える 4

65

イベント ストリームを分割する方法がわかれば、トピック名は簡単になるので、まずその質問に答えましょう。

@Ludd は正しいです。選択するパーティション構造は、イベント ストリームの処理方法に大きく依存します。理想的には、イベント処理がpartition-localであることを意味するパーティション キーが必要です。

例えば:

  1. ユーザーの平均サイト滞在時間を気にする場合は、 で分割する必要があります:user-id。こうすることで、1 人のユーザーのサイト アクティビティに関連するすべてのイベントを同じパーティション内で利用できるようになります。これは、 Apache Samzaなどのストリーム処理エンジンが、単一のパーティション内のイベントを調べるだけで、特定のユーザーの平均サイト滞在時間を計算できることを意味します。これにより、あらゆる種類のコストのかかるパーティショングローバル処理を実行する必要がなくなります
  2. Web サイトで最も人気のあるページに関心がある場合は、:viewedページごとに分割する必要があります。繰り返しになりますが、Samza は、単一のパーティション内のイベントを確認するだけで、特定のページのビュー数を保持できます。

一般に、グローバル状態 (DynamoDB や Cassandra などのリモート データベースにカウントを保持するなど) に依存する必要を回避し、代わりにパーティション ローカル状態を使用して作業できるようにしています。これは、ローカル状態がストリーム処理の基本的なプリミティブであるためです。

上記のユースケースの両方が必要な場合、Kafka での一般的なパターンは、最初に say によって分割し、:user-id次に次の処理フェーズのために readyによって再分割することです。:viewed

トピック名について - ここで明らかなものはeventsoruser-eventsです。より具体的には、events-by-user-idand/orを使用できますevents-by-viewed

于 2015-02-24T17:11:39.093 に答える