私はMVCSpringWebアプリを開発していますが、オフライン分析のためにユーザーのアクション(ユーザーがクリックしたものなど)をデータベースに保存したいと思います。アクションがタプル(長いuserId、長いactionId、日付のタイムスタンプ)であるとしましょう。私はユーザーの行動には特に興味がありませんが、これを例として取り上げます。
多くの(異なる)ユーザーによる1分(秒)あたりの多くのアクションを期待しています。したがって、処理時間は非常に重要です。
現在の実装では、アクションをデータベースに格納するための接続プールを備えたデータソースを定義しました。コントローラのリクエストメソッドからサービスを呼び出し、このサービスがDAOを呼び出して、アクションをデータベースに保存します。
この実装は、コントローラーからデータベースに至るまでの呼び出しが行われるのを待ってユーザーに応答を返すため、効率的ではありません。そのため、この「アクションの保存」をスレッドにラップして、ユーザーへの応答を速くすることを考えていました。応答を得るためにスレッドを終了する必要はありません。
私は、これらの大規模で同時かつタイムクリティカルなアプリケーションの経験がありません。したがって、フィードバック/コメントは非常に役立ちます。
今私の質問は次のとおりです。
そのようなシステムをどのように設計しますか?サービスを実装し、それをすべてのアクションで呼び出されるスレッドにラップしますか?
何を使うべきですか?Spring BatchとこのJobLauncherをチェックしましたが、それが自分にとって正しいかどうかはわかりません。
コントローラ、サービス、DAO、およびデータソースレベルで同時アクセスがあるとどうなりますか?
より一般的に言えば、そのようなアプリケーションを設計するためのベストプラクティスは何ですか?
ご協力ありがとうございました!