Акка Балансировочный пул с пул-пулом-исполнителем переменного размера

Вот мой вариант использования:

Я хочу создать маршрутизатор Balancing-Pool размера x (x - это число экземпляров / маршрутов, которое определяется во время выполнения), причем каждый из маршрутов имеет свой собственный выделенный поток. Предполагается, что каждый из маршрутов будет выполнять операции блокировки.

В документации Akka объясняется, что вы не можете изменить диспетчер балансировочного пула. Что исключает возможность использования закрепленного диспетчера (который будет делать именно то, что мне нужно, пул потоков размером 1 на рут).

Из документации Акки:

BalancingPool автоматически использует специальный BalancingDispatcher для своих маршрутов - игнорируя любой диспетчер, который установлен в объекте Routee Props. Это необходимо для реализации семантики балансировки посредством совместного использования одного и того же почтового ящика всеми маршрутами.

Хотя невозможно изменить диспетчер, используемый маршрутами, можно точно настроить используемый исполнитель. По умолчанию используется fork-join-dispatcher, и его можно настроить, как описано в разделе "Диспетчеры" [AJ: я считаю, что это опечатка, и они означают fork-join-executor]. В ситуациях, когда маршруты должны выполнять операции блокировки, может быть полезно заменить его исполнителем пула потоков, явно указывающим на количество выделенных потоков

Пример конфигурации из документов Akka:

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()

Поскольку диспетчер балансировки "управляется: java.util.concurrent.ExecutorService", возможно ли создать ExecutorService и передать его маршрутизатору балансировочного пула или его диспетчеру?

1 ответ

Возможно, что-то вроде этого:

val bp = BalancingPool(instances, routerDispatcher = "pinned-dispatcher")
val myRouter = context.actorOf(Props...)
    .withRouter(bp),
  name = "myRouter")
Другие вопросы по тегам