2013-08-26 29 views
9

私は、定期的なCPU集約型データ取り込みを実行し、RESTfulエンドポイントを提供する俳優ベースのシステムを持っています。私はAkkaの俳優を使って、摂取プロセスのさまざまな段階を制御/制御しています.Spray(もちろんAkkaをベースにしています)を使って、安らかなエンドポイントを提供しています。Akka俳優優先度

私の問題はこれです。取り込みが開始されると、ほとんどのCPUが消費され、完了するまでRESTfulなエンドポイントが枯渇します。

インジェストの優先度を下げる最良の方法は何ですか?現在、インジェストとスプレーモジュールは同じActorSystemを共有していますが、それがソリューションに役立つ場合は分離できます。

答えて

8

システム内のさまざまなアクターが異なるディスパッチャーに住む必要があるようです。 CPUを大量に消費する俳優のための新しいディスパッチャを作成し、デフォルトのディスパッチャにWebサービスのアクタを残してください(あるいは、別のディスパッチャにも移動してください)

新しく作成されたディスパッチャ - 例えば、あなたのインジェストアクターが計算集約型のジョブを実行しているとすれば、ディスパッチャーの並列度を1.0に近い値に減らす必要があります。

アクターシステムを異なるディスパッチャーに分けることで、アクターは基底のスレッドを起動し、それらを実行するディスパッチャーを飽和させます。別のディスパッチャにWebアクタを置くことで、CPUを大量に消費するアクタが残りのシステムに及ぼす影響を制限できます。これは、"bulkheading"という概念に多少似ています。

ここアッカのディスパッチャにいくつかの詳細情報です:それは文書の構成セクションを見てみることも価値がある新しいディスパッチャを設定するには http://doc.akka.io/docs/akka/2.2.0/scala/dispatchers.html

http://doc.akka.io/docs/akka/2.2.0/general/configuration.html

2

することができ、優先度のメールボックスがあります。どのメッセージがどの優先順位で処理されるかを定義するために構築されています。 また、特定の状態になったときにメッセージを隠して対処したい場合は、ホットスワップでうまく動作するメッセージを隠す/取り消すこともできます。隠し情報はここにあります:http://doc.akka.io/docs/akka/snapshot/scala/actors.html