2016-06-01 13 views
5

私のストリームには、CPUバウンドステージとIOバウンドステージが均等に混在しています(IOステージごとにCPUステージが続きます)。私がやりたいことは、IO操作を残りのストリームとは異なるディスパッチャに置くことです。Akkaストリーム - 別のディスパッチャにIOバウンドフローを設定する

従来のアクターベースのAkkaアプリケーションでは、IOアクターを多数のスレッドで固定スレッドプールディスパッチャーに配置し、CPUバインドアクターを少数のスレッドでフォーク結合プールに配置することができました理想的には、コア数の1)。これは、IOに多くのスレッドをブロックすることによってスループットを向上させながら、CPUバインドされたアクターのスレッド切り替えに浪費される時間を削減するはずです。

これは正しいですか?そうでない場合、なぜですか?はいの場合、IOバインドステージ(フロー)をストリームの残りのディスパッチャに配置するにはどうすればよいですか?

私は自動融合をオフにしようとしましたが、それは助けになります。しかし、それはほぼ同等のAkkaの同等物よりもずっと少ないスループットを有する。

stage.withAttributes(ActorAttributes.dispatcher("dispatcher-name")) 

する。これは、非同期境界をご紹介します:

答えて

8

デフォルトでは、あなたはそうのように、ステージは、属性を使用して別のディスパッチャ上で実行する必要があることをマークすることができ、フローのすべての段階が同じ役者上で実行されていることですそのステージの周りで、効果的にそれを自分の俳優で実行します。非同期境界が高価にならないようにするために、ステージは実際には上流から16要素の要求を実際に送信するので、これはあなたが知っておく必要があるものです。

バッファサイズを追加の属性で調整することができます。この場合、一度に1つの要素を尋ねるという点で融合段階のように動作しますが、ユースケースによってはオーバーヘッドが大きくなる可能性があります。ドキュメントの

stage.withAttributes(Attributes.inputBuffer(1, 1)) 

関連部品:答えを

+0

感謝。これは私が探していたものです。 – anindyaju99

+0

回答を返信してバックグラウンドで作業し続ける場合はどうすればよいですか? [This](https://gist.github.com/asarkar/37e4cb026c463f6334617e923cfc4b12)が動作しているようです。 –

関連する問題