データ量の多いデータベースを呼び出したいのですが、戻るまでに時間がかかる場合があります。
私はAkka.future(f)の呼び出し内でその作業を行い、作業が完了したときにAsync{}を使用して応答をレンダリングすることを計画しています。
それを行うのは理にかなっていますか、それとも、作業をAkkaに送信せずに、コントローラーで長いデータベース呼び出しを行う必要がありますか?
または、ノンブロッキングデータベースアクセスを行う方法はありますか?
データ量の多いデータベースを呼び出したいのですが、戻るまでに時間がかかる場合があります。
私はAkka.future(f)の呼び出し内でその作業を行い、作業が完了したときにAsync{}を使用して応答をレンダリングすることを計画しています。
それを行うのは理にかなっていますか、それとも、作業をAkkaに送信せずに、コントローラーで長いデータベース呼び出しを行う必要がありますか?
または、ノンブロッキングデータベースアクセスを行う方法はありますか?
データベースにブロッキングドライバーを使用せざるを得ない場合(何らかの理由でMySQLの非同期ドライバーが機能しない場合)、PinnedDispatcherを使用して(ルーティングを使用して)アクタープールを設定することを検討してください。
PinnedDispatcherは、アクターごとにスレッドを提供し、ルーターを設定することで、データベース呼び出しの処理を厳密に担当するスレッドの数を調整できるようになります。簡単なスケーリング。また、アクターを使用すると、アクター間のメッセージ(データベース呼び出しの結果を含むメッセージなど)を少し簡単に構成できます。
独自のAkka構成ファイルを使用Akka.future(f)
および提供して、データベースアクセスを処理するスレッドを増やすことができます。たとえば、この構成ファイルを見てください。
しかし、あなたはそれを指摘しました:本当の問題は、ブロックするデータベースドライバを使用することです。使用しているDBはわかりませんが、たとえばReactiveMongoを使用したMongoDBを確認する価値があります。ReactiveMongoを使用すると、すべてのMongoDB操作が完全に非ブロッキングで非同期になります。ここに良い紹介があります。さらに、Play Frameworkを非常にうまく処理します(ReactiveMongo Playプラグインを確認してください)。
編集:「Playframeworkの内部Akkaシステムの構成」をチェックして、ワーカースレッド数を調整することもできます。
データベース呼び出しの完了時に応答がブロックされた場合、呼び出しの実行中に応答のアセンブルに向けて他の作業を実行できる場合にのみ、応答を非同期にすることが有用です。
非ブロッキングデータベースアクセスは、いくつかの異なることを意味する可能性があります。コールバックベースのAPIを提供するクライアントライブラリ。これは、将来のソリューションと非常によく似ています。または、非ブロッキングソケットを使用してスレッドの使用量を節約するクライアントライブラリです。前者のことだと思いますが、その場合は未来を使うのと機能的には同じだと思います。