Akka - принудительная сериализация реквизита при создании - PullRequest
1 голос
/ 28 января 2020

У меня есть кластер 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 решения, которые не годятся:

  1. Используйте serialize-creators = on, что не рекомендуется для prod, и это сериализует других актеров, которые не разделяют проблему c состояние

  2. Создайте клон общего состояния перед инициализацией актера:

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

    В этом решении параметры будут клонированы, даже если он отправляется удаленно, поэтому он не идеален с точки зрения производительности

Есть ли какое-то другое решение, которое мне не хватает?

...