これが私のユースケースです:
サイズ x (x は実行時に決定されるインスタンス/ルートの数) の Balancing-Pool ルーターを作成し、各ルートに独自の専用スレッドを持たせたいと考えています。各ルートはブロッキング操作を実行することが期待されています。
Akka のドキュメントでは、バランシング プールのディスパッチャーを変更できないと説明されています。これにより、Pinned Dispatcher を使用するオプションがなくなります (ルートごとにサイズ 1 のスレッドプールが必要です)。
Akka のドキュメントから:
BalancingPool は、そのルートに特別な BalancingDispatcher を自動的に使用します。ルートの Props オブジェクトに設定されているディスパッチャーは無視されます。これは、すべてのルートで同じメールボックスを共有することによってバランシング セマンティクスを実装するために必要です。
ルートで使用されるディスパッチャーを変更することはできませんが、使用されるエグゼキューターを微調整することは可能です。デフォルトではfork-join-dispatcherが使用され、Dispatchers で説明されているように構成できます[AJ: これはタイプミスであり、fork-join-executor を意味します]。ルートがブロッキング操作を実行することが予想される状況では、割り当てられたスレッドの数を明示的に示唆するスレッドプールエグゼキュータに置き換えると便利な場合があります
Akka docs からの設定サンプルも:
akka.actor.deployment {
/parent/router10b {
router = balancing-pool
nr-of-instances = 5
pool-dispatcher {
executor = "thread-pool-executor"
# allocate exactly 5 threads for this pool
thread-pool-executor {
core-pool-size-min = 5
core-pool-size-max = 5
}
}
}
}
ルートの数に一致するプール サイズを持つスレッドプール エグゼキューターが機能するように見えますが、ここに問題があります。構成でプールサイズを明示的に設定する必要がありますか?
また、構成からルートのエグゼキューターをプルしながら、(コードで) Balancing-Pool を作成することは可能ですか? つまり、構成を使用してルーターを定義したくありません。使用したいのは次のとおりです。
val myRouter = BalancingPool(x).props(Props[Worker])...)
ただし、 withMailbox() または withDispatcher() の同じスタイルを使用して、使用するエグゼキューターを (構成から) どういうわけか指定します
Balancing Dispatcher は "Driven by: java.util.concurrent.ExecutorService"であるため、ExecutorService を作成して、balancing-pool ルーターまたはそのディスパッチャーに渡すことはできますか?