У меня есть кластер Akka, где актеры могут быть созданы удаленно и локально.
Когда актер создан, он получает начальное состояние (parameters
в приведенном ниже примере).
Я ищу метод для клонирования исходного состояния, потому что, когда 2 актера создаются локально, они работают с одной ссылкой и имеют состояние гонки (когда актер создал удаленно, он получил сериализованную копию объекта).
boolean allowLocalRoutees = true;
Set<String> useRoles = Set.of("worker");
ActorRef router = context.actorOf(
new ClusterRouterPool(
new RoundRobinPool(POOL_SIZE),
new ClusterRouterPoolSettings(
numOfWorkers, maxInstancesPerNode, allowLocalRoutees, useRoles))
.props(Props.create(Worker.class, masterRef, parameters
)));
I найдено 2 решения, которые не годятся:
Используйте serialize-creators = on
, что не рекомендуется для prod, и это сериализует других актеров, которые не разделяют проблему c состояние
Создайте клон общего состояния перед инициализацией актера:
boolean allowLocalRoutees = true;
Set<String> useRoles = Set.of("worker");
Parameters clonedParameters = parameters.clone();
ActorRef router = context.actorOf(
new ClusterRouterPool(
new RoundRobinPool(POOL_SIZE),
new ClusterRouterPoolSettings(
numOfWorkers, maxInstancesPerNode, allowLocalRoutees, useRoles))
.props(Props.create(Worker.class, masterRef, clonedParameters
)));
В этом решении параметры будут клонированы, даже если он отправляется удаленно, поэтому он не идеален с точки зрения производительности
Есть ли какое-то другое решение, которое мне не хватает?