2

これが私のユースケースです:

サイズ 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 ルーターまたはそのディスパッチャーに渡すことはできますか?

4

1 に答える 1

0

おそらく次のようなものです:

val bp = BalancingPool(instances, routerDispatcher = "pinned-dispatcher")
val myRouter = context.actorOf(Props...)
    .withRouter(bp),
  name = "myRouter")
于 2016-12-22T22:14:41.263 に答える