如何通过配置文件正确设置 AKKA 路由数

how to properly set AKKA number of routee via configuration file

我目前正在学习 AKKA,但在控制路由数量方面遇到了问题。我正在尝试实现一个集群,集群感知路由器作为接待员,简单的演员作为路由,所有 运行 在我的本地进行开发。说我有一个 配置如下

deployment {
  /RouterA {
    router = round-robin-pool
    metrics-selector = mix
    nr-of-instances = 20
    routees.paths = ["/user/ActorA"]
    cluster {
      enabled = on
      max-nr-of-instances-per-node = 20
      allow-local-routees = on
    }
  }
}

然后我可以在调试日志中看到 20 个路由器

并且我将 RouterA 注册为集群接待员,如下所示

ActorRef someactor=system.actorOf(Props.create(Something.class),"ActorA");
ActorRef routerA=system.actorOf(FromConfig.getInstance().props(),"RouterA");
ClusterClientReceptionist.get(system).registerService(routerA);

问题 1:我是否将特定路由器实例注册为接待员?还是其中的 20 个?是否 possible/suggested 将 a/20 路由器注册为接待员?

Q2:为什么我看到 20 个路由器都使用相同的 ActorA(通过 this.hashCode() )实例?配置路由器(通过文件)的正确方法是什么,因此无论本地还是远程,它都会将消息发送到 20 个路由之一?还是我创建 20 个路由的方式有误? (需要20个routee来平衡负载)

Q3:如果我使用如下配置,调试日志中似乎只有一台路由器,为什么?是因为优化尺寸探索调整器吗?所以它丢弃了 nr-of-instances = 20 ?如果是这样,我如何使路由器加速?

deployment {
  /RouterA {
    router = cluster-metrics-adaptive-group
    metrics-selector = mix
    nr-of-instances = 20
    routees.paths = ["/user/ActorA"]
    cluster {
      enabled = on
      max-nr-of-instances-per-node = 20
      allow-local-routees = on
    }
    optimal-size-exploring-resizer {
          enabled = on
          action-interval = 5s
          lower-bound = 10
          upper-bound = 50
          downsize-after-underutilized-for = 72h
    }
  }
}

谢谢

首先需要给你一些概念,看来你理解错了。

nr-of-instances = 20 等同于max-total-nr-of-instances = 20,见以下解释:

Maximum number of routees that will be deployed, in total on all nodes. See also description of max-nr-of-instances-per-node. For backwards compatibility reasons, nr-of-instances has the same purpose as max-total-nr-of-instances for cluster aware routers and nr-of-instances (if defined by user) takes precedence over max-total-nr-of-instances.

这意味着在您的集群中,您的路由器最多只会有新的 20 个路由。但是它会新增多少路由取决于其他2个参数:

1) max-nr-of-instances-per-node = 20,解释如下:

Maximum number of routees that will be deployed on each cluster member node. Note that max-total-nr-of-instances defines total number of routees, but number of routees per node will not be exceeded, i.e. if you define max-total-nr-of-instances = 50 and max-nr-of-instances-per-node = 2 it will deploy 2 routees per new member in the cluster, up to 25 members.

2) 您拥有的集群成员数。

这里,您的情况是:

nr-of-cluster-node = 1

max-nr-of-instances-per-node = 20

因此路由总数为 nr-of-cluster-node * max-nr-of-instances-per-node = 20,即使您设置 nr-of-instances = 100,路由仍将 20,因为没有足够的节点来托管您的路由。

所以正确的代码如下:

ActorRef routerA = system.actorOf(FromConfig.getInstance().props(Props.create(ActorA.class)), "routerA");
ClusterClientReceptionist.get(system).registerService(routerA);

以上代码将为您创建一个 router actor,并使用 ActorA instance 作为您的路由。然后,对于您的场景,将生成 20 个 actor,当您向接待员发送消息时,消息将被发送到路由器,路由器将选择一个 routee 来处理消息(取决于路由器类型)。

接下来说明你的问题:

第 1 季度:

根据代码,不是你想象的那样,它不会设置20个路由器,它只会为你设置一个路由器,详细见上面的解释。所以只有一个路由器被注册到接待员。

第 2 季度:

我认为你看不到20个路由器,同时,我认为你也看不到20个routee。使用您的代码 ActorRef someactor=system.actorOf(Props.create(Something.class), "ActorA");,您可以看到只创建了一个演员,而这不是 router actor 创建的。只有一个演员实例,您肯定只会看到相同的演员哈希码。你的application.conf是对的,只是你理解错了,你的代码错了。

Q3:

同样,不是一个路由器,而是一个路由器。这是因为代码ActorRef someactor=system.actorOf(Props.create(Something.class), "ActorA");,你自己创建了一个routee。

router = cluster-metrics-adaptive-group,这意味着 router 不会为你创建 routee,它会使用已经存在的 routee,你只需将其设置为 routees.paths = ["/user/ActorA"] ],这里只设置了一个routee actor