11

私はJavaから来ており、スレッドプールに支えられたRunnablesを送信します。ExecutorServiceJavaでは、スレッドプールのサイズに制限を設定する方法は非常に明確です。

Scalaアクターの使用に興味がありますが、並行性を制限する方法がわかりません。

仮に、「ジョブ」を受け入れるWebサービスを作成しているとしましょう。ジョブはPOSTリクエストとともに送信されます。サービスでジョブをキューに入れてすぐに返すように202 Acceptedします。つまり、ジョブは非同期で処理されます。

アクターを使用してキュー内のジョブを処理している場合、処理される同時ジョブの数を制限するにはどうすればよいですか?

これに取り組むためのいくつかの異なる方法を考えることができます。コミュニティのベストプラクティスがあるのか​​、少なくとも、Scalaの世界である程度標準的な明確に確立されたアプローチがあるのか​​疑問に思います。

私が考えたアプローチの1つは、ジョブキューとジョブ処理アクターを管理する単一のコーディネーターアクターを持つことです。単純なintフィールドを使用して、現在処理されているジョブの数を追跡できると思います。ただし、エラーが発生したときに追跡して数を減らすなど、そのアプローチにはいくつかの落とし穴があると確信しています。だから私は、Scalaがこれに対してもっと単純な、あるいはもっとカプセル化されたアプローチをすでに提供しているのだろうかと思っています。

ところで、私は少し前にこの質問をしようとしましたが、私はそれをひどく尋ねました。

ありがとう!

4

3 に答える 3

7

Scalaの代替アクター実装であるAkkaをご覧になることを強くお勧めします。

http://www.akkasource.org

AkkaにはすでにJAX-RS[1]統合があり、これをLoadBalancer [2]と組み合わせて使用​​して、並行して実行できるアクションの数を調整できます。

[1] http://doc.akkasource.org/rest [2] http://github.com/jboner/akka/blob/master/akka-patterns/src/main/scala/Patterns.scala

于 2010-02-22T20:24:37.913 に答える
5

システムプロパティをオーバーライドしてactors.maxPoolSizeactors.corePoolSizeアクタースレッドプールのサイズを制限し、アクターが処理できる数のジョブをプールにスローすることができます。なぜあなたはあなたの反応を抑える必要があると思いますか?

于 2010-02-22T18:23:40.863 に答える
3

ここには本当に2つの問題があります。

1つは、アクターが使用するスレッドプールを制御下に置くことです。これは、システムプロパティactors.maxPoolSizeを設定することで実行できます。

2つ目は、プールに送信されたタスクの数が急増していることです。これに関心がある場合とない場合がありますが、あまりにも多くのタスクを生成する速度が速すぎると、メモリ不足エラーや場合によってはより微妙な問題などの障害状態を引き起こす可能性があります。

各ワーカースレッドは、タスクのデキューを維持します。デキューは、ワーカースレッドが最大サイズまで動的に拡大する配列として実装されます。2.7.xでは、キュー自体が非常に大きくなる可能性があり、多数の同時スレッドと組み合わせると、メモリ不足エラーがトリガーされることがわかりました。最大デキューサイズは2.8より小さくなります。デキューもいっぱいになる可能性があります。

この問題に対処するには、生成するタスクの数を制御する必要があります。これは、概説したように、おそらく何らかのコーディネーターを意味します。この問題は、ある種のデータ処理パイプラインを開始するアクターが、パイプラインの後半のアクターよりもはるかに高速である場合に発生しました。プロセスを制御するために、私は通常、チェーンの後半のアクターにチェーンの前のアクターをXメッセージごとにpingバックさせ、チェーンの前のアクターをXメッセージの後で停止させてpingバックを待ちます。より集中化されたコーディネーターでそれを行うこともできます。

于 2010-02-23T01:34:26.873 に答える