多数のユーザートランザクションを分析し、集約された測定値(傾向など)を生成するシステムを設計しています。システムは高速に動作し、堅牢でスケーラブルである必要があります。システムはJavaベースです(Linux上)。
データは、ユーザートランザクションのログファイル(CSVベース)を生成するシステムから到着します。システムは毎分ファイルを生成し、各ファイルにはさまざまなユーザーのトランザクション(時間でソート)が含まれ、各ファイルには数千人のユーザーが含まれる場合があります。
CSVファイルのサンプルデータ構造:
10:30:01、ユーザー1、...
10:30:01、ユーザー1、...
10:30:02、ユーザー78、...
10:30:02、ユーザー2、...
10: 30:03、ユーザー1、...
10:30:04、ユーザー2、
...。。。
私が計画しているシステムは、ファイルを処理し、リアルタイムで分析を実行する必要があります。入力を収集し、それをいくつかのアルゴリズムや他のシステムに送信し、計算結果をデータベースに保存する必要があります。データベースは実際の入力レコードを保持しませんが、トランザクションに関する高レベルの集約分析のみを保持します。たとえば、トレンドなど。
私が使用することを計画している最初のアルゴリズムは、最良の操作のために少なくとも10ユーザーレコードを必要とします。5分後に10レコードが見つからない場合は、利用可能なデータを使用する必要があります。
実装にはStormを使用したいのですが、この議論は可能な限り設計レベルに残したいと思います。
システムコンポーネントのリスト:
着信ファイルを毎分監視するタスク。
ファイルを読み取り、解析して、他のシステムコンポーネントやアルゴリズムで使用できるようにするタスク。
ユーザーのために10レコードをバッファリングするコンポーネント(5分以内)。10レコードが収集されたとき、または5分が経過したとき、さらに処理するためにデータをアルゴリズムに送信します。アルゴリズムに少なくとも10個のレコードを提供する必要があるため、ストームフィールドグループ化(同じタスクが同じユーザーに対して呼び出されることを意味します)を使用して、タスク内の10個のユーザーのレコードのコレクションを追跡することを考えました。もちろん計画していますこれらのタスクのいくつかを持つために、それぞれがユーザーの一部を処理します。
単一のトランザクションで機能する他のコンポーネントがあります。それらについては、(他のタスクと並行して)解析されるときに各トランザクションを受け取る他のタスクを作成することを計画しています。
#3であなたの助けが必要です。
そのようなコンポーネントを設計するためのベストプラクティスは何ですか?ユーザーごとに10レコードのデータを維持する必要があることは明らかです。キーバリューマップが役立つ場合があります。マップをタスク自体で管理するか、分散キャッシュを使用する方がよいでしょうか。たとえば、RedisはKey Value Storeです(これまで使用したことはありません)。
ご協力いただきありがとうございます