Акка Балансировочный пул с пул-пулом-исполнителем переменного размера
Вот мой вариант использования:
Я хочу создать маршрутизатор 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")