4

私はMVCSpringWebアプリを開発していますが、オフライン分析のためにユーザーのアクション(ユーザーがクリックしたものなど)をデータベースに保存したいと思います。アクションがタプル(長いuserId、長いactionId、日付のタイムスタンプ)であるとしましょう。私はユーザーの行動には特に興味がありませんが、これを例として取り上げます。

多くの(異なる)ユーザーによる1分(秒)あたりの多くのアクションを期待しています。したがって、処理時間は非常に重要です。

現在の実装では、アクションをデータベースに格納するための接続プールを備えたデータソースを定義しました。コントローラのリクエストメソッドからサービスを呼び出し、このサービスがDAOを呼び出して、アクションをデータベースに保存します。

この実装は、コントローラーからデータベースに至るまでの呼び出しが行われるのを待ってユーザーに応答を返すため、効率的ではありません。そのため、この「アクションの保存」をスレッドにラップして、ユーザーへの応答を速くすることを考えていました。応答を得るためにスレッドを終了する必要はありません。

私は、これらの大規模で同時かつタイムクリティカルなアプリケーションの経験がありません。したがって、フィードバック/コメントは非常に役立ちます。

今私の質問は次のとおりです。

  • そのようなシステムをどのように設計しますか?サービスを実装し、それをすべてのアクションで呼び出されるスレッドにラップしますか?

  • 何を使うべきですか?Spring BatchとこのJobLauncherをチェックしましたが、それが自分にとって正しいかどうかはわかりません。

  • コントローラ、サービス、DAO、およびデータソースレベルで同時アクセスがあるとどうなりますか?

より一般的に言えば、そのようなアプリケーションを設計するためのベストプラクティスは何ですか?

ご協力ありがとうございました!

4

4 に答える 4

2

これが私がそのためにしたことです:

収集したいユーザーのすべてのアクションをマークするためにaspectJを使用しました。次に、これを非同期のdbAppenderを使用してlog4jに送信しました...

これにより、log4jログレベルでオンまたはオフにできます。

完璧に動作します。

于 2013-03-15T15:31:06.660 に答える
2

ユーザーが実行するアクションに関心がある場合は、ユーザーが送信する HTTP リクエストからそれを把握できるはずです。そのため、アプリケーション サーバーに転送する Apache Web サーバーで受信リクエストをログに記録することをお勧めします。アプリケーション サーバーの前に Web サーバーのクラスターを配置することは一般的な方法であり (静的コンテンツを提供するのに適しています)、いずれにせよ通常は要求をログに記録します。そうすれば、ロギングが高速になり、アプリケーションがそれに対処する必要がなくなります。最大の作業は、分析を行うデータベースにログを丸呑みするスクリプトを作成することです。

于 2013-03-15T15:21:50.197 に答える
2

通常、Java EE アプリケーションで独自のスレッドを生成することは、悪い形式と見なされます。

より良いアプローチは、JMS を介してローカル キューに書き込み、それをデータベースに永続化するメッセージ駆動型 Bean (EJB または Spring では非常に簡単) などの別のコンポーネントを用意することです。

もう 1 つの方法は、ログ ファイルに書き込むだけで、プロセスにログ ファイルを読み取らせ、1 日 1 回またはいつでもデータベースに書き込むようにすることです。

考慮すべき事項は次のとおりです。

  • どのくらい最新の情報が必要ですか?
  • 情報はどれほど重要ですか。一部を失う可能性はありますか?
  • 注文にはどの程度の信頼性が必要ですか?

これらはすべて、キュー/ログ ファイルを処理しているスレッドの数、永続的な JMS キューが必要かどうか、メイン コンテナーに対してリモート システムで処理を行う必要があるかどうかを考慮します。

これがあなたの質問に答えることを願っています。

于 2013-03-15T15:08:17.643 に答える
2

シングルトン オブジェクト @ アプリ レベルを取得し、すべてのユーザー アクションで更新します。このシングルトン オブジェクトには、ジェネリックとして Hashmap が必要です。これは、10000 カウントのしきい値レベルに達した後、定期的に更新され、Spring バッチとして DB に保存されます。

また、定期的に、処理するたびにレコードの最後の番号まで更新/クリーンアップします。また、シングルトン インスタンスの再初期化を週次/月次で行うこともできます。アプリが複数の JVM にデプロイされている場合、これは同じものを更新するという問題につながる可能性があることに注意してください。そのため、シングルトンで clone not supported 例外を実装する必要があります。

于 2013-06-24T03:37:43.963 に答える