大量のログ データをグラフ化して分析するために使用するアプリケーションを作成しています。基本的に、アプリケーション (Web、Tomcat、コンソールなど) にはlog4j
、ログ エントリをリモート サーバーに送信するカスタム アペンダーがあります。
とりあえず、通常の HTTP POST 経由でこれらのログ エントリを受け入れたいと思います。その時点で、Web サービスはエントリをデータベースに記録します。
Node.js
との間のフェンスにいAkka
ます。主な理由は、Java と JavaScript の両方の経験があるからです。しかし、私は Akka のアクター パターンに不慣れで、複数のノード サーバーを実行しない限り、ノードは真に並列ではないことを読んだことがありますか?
私の論理はこれです:
1) サーバーへのアプリケーション POST ログ エントリ
2) サーバーは HTTP リクエストを受け取り、Amazon SQS エントリを作成します (または Azure Service Bus..まだ決定していません)。
3) ワーカーはキューを一掃し、エントリを DB に保存します。
これにより、非常に高速な入力が可能になると思いますが、SQS 操作を呼び出すと、長い IO プロセスになります。
私のもう 1 つのアイデアは、POST リクエストを受け入れ、それを memcached または Redis に保存し、ワーカーにキャッシュからプルさせ、SQS に送信してから、DB 挿入のキューを消去することでした。これには、HTTP リクエストができるだけ早くデータを渡し、他のワーカーがデータの記録を処理できるという利点があります。
これは明らかに Akka の仕事のように思えます。なぜなら、リクエストごとにアクターを割り当ててから、他のアクターをスポーンさせてキャッシュの内外への移動を処理させることができないからです。
テスト段階では、一度に 20 ~ 500 件のリクエストが来ることを簡単に確認できました。テストでオンにしたアプリの数によって異なります。しかし、完全に実行すると、すべてのアプリから 1 秒あたり数千のリクエストが来ることがわかりました。
ですから、私の質問は、取得する膨大な量のデータをどのように処理するのが最善かということです. スレッドロック、http ブロッキングなどに関心があります。