30

初心者として、私は俳優がどのように機能するかを理解しようとしています。そして、ドキュメントから、アクターは同期モードで実行されるオブジェクトであり、アクターの実行にはブロック/同期メソッド呼び出し (db リクエストなど) を含めることができることを理解していると思います

しかし、私が理解していないのは、内部にいくつかのブロッキング呼び出し (クエリ実行のブロッキングなど) を持つアクターを作成すると、スレッド プール全体が台無しになるということです (CPU 使用率が低下するなどの意味で)。 )、 右 ?つまり、私の理解では、アクターがブロッキング呼び出しを行った場合、そのスレッドを他の誰かに切り替えることができるかどうかを JVM が理解する方法はありません。

同時実行の性質を考えると、アクタがブロッキング呼び出しを行ってはならないことは明らかではないでしょうか?

その場合、非ブロッキング/非同期呼び出しを実行する推奨される方法は何ですか? たとえば、何かをフェッチし、その要求が完了したときに別のアクターにメッセージを送信する Web サービス呼び出しとしましょう? アクター内で単純に次のようなものを使用する必要があります。

未来図 { 応答 => x ! response.body }

これはこれを処理する適切な方法ですか?

これを明確にしていただければ幸いです。

4

3 に答える 3

1

Akka で呼び出しをブロックすることを検討している場合、スレッド プールについて考えるのは正しいことです。ブロッキングを行うほど、必要なスレッド プールが大きくなります。完全にノンブロッキングのシステムでは、マシンの CPU コアの数に等しいスレッドのプールのみが実際に必要です。参照構成では、マシン上の CPU コア数の 3 倍のプールを使用して、ある程度のブロッキングを可能にします。

    # The core pool size factor is used to determine thread pool core size
    # using the following formula: ceil(available processors * factor).
    # Resulting size is then bounded by the core-pool-size-min and
    # core-pool-size-max values.
    core-pool-size-factor = 3.0

ソース

ただしakka.default-dispatcher.fork-join-executor.core-pool-size-factor、より多くのブロッキングを行う場合は、より高い数に増やすか、デフォルト以外のディスパッチャーを作成して、より高い値で呼び出しをブロックすることをお勧めします。fork-join-executor.core-pool-size-factor

WRT Akka でブロッキング呼び出しを行う最良の方法は何ですか。呼び出しをブロックするアクターの複数のインスタンスを作成し、それらの前にルーターを配置して、アプリケーションの残りの部分から単一のアクターのように見えるようにすることで、スケールアウトすることをお勧めします。

于 2013-11-13T08:28:38.440 に答える