6

Playframework アプリケーションが時々応答しないという問題があり、実行時にこれを検出し、使い果たされた実行コンテキストで現在実行されているものに関する情報をログに記録したいと考えています。

これを実装するための最良の戦略は何でしょうか? 小さなランナブルを実行コンテキストに投稿することを考えました。それらが時間内に実行されない場合は、警告をログに記録します。もちろん、この最大待機時間は構成可能である必要があります。たとえば、メインの Web 実行コンテキストは 1 秒以上ブロックされるべきではありませんが、バックグラウンドのデータベース実行コンテキストでは 30 秒のブロックが許可される場合があります。

誰かが以前にこれを行ったに違いありませんか?

関連情報: http://www.playframework.com/documentation/2.2.x/ThreadPools

4

1 に答える 1

2

それは答えるのがかなり難しい質問です。

ディスパッチャーの構成は、アクターが行っている作業の種類によって異なります。

おそらく、作業を行うために先物を生成するアクターに注目する必要があります。構成ファイルで実行コンテキストを事前に定義し、次のように使用することをお勧めします。

implicit val ec : ExecutionContext = context.system.dispatchers.lookup("someDispatcher")

これらのアクターは飢餓効果を引き起こす可能性があります。

達成したい効果は、メッセージが迅速に処理され、実行時間の長いタスクがメッセージに影響を与えないようにすることです。そのため、ここでは分離が重要です。

アプリケーションを監視するための優れたツールはTypesafe Consoleです。そこでディスパッチャーを見ると、メッセージ処理のレイテンシーが増加していることがわかります。

もう 1 つの懸念事項は、ネットワーク I/O のような高リスクの作業を行うアクターを特定することです。スレッドがプールで再び使用できなくなると、問題が発生します。

スレッドプールのサイズを試してみないと、最適な設定がわからない可能性が非常に高くなります。

私が書いたこれらのアドバイスのほとんどは、本から知ってEffective Akka by Jamie Allenおり、私にとっては非常にうまく機能しているようです. この本にはセクションがありFixing Starvationます。あなたはそれをもっと近くで見たいと思うかもしれません。

于 2014-04-04T09:41:45.320 に答える