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

如何通过配置文件正确设置路由的AKKA号,akka,akka-cluster,Akka,Akka Cluster,我目前正在学习AKKA,在控制路线数量方面有问题。我正在尝试实现一个集群,集群感知路由器作为接待员,简单参与者作为路由器,所有这些都运行在我的本地服务器上进行开发 配置如下所示 deployment { /RouterA { router = round-robin-pool metrics-selector = mix nr-of-instances = 20 routees.paths = ["/user/ActorA"] cluster {

我目前正在学习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个?是否可以/建议将a/20路由器注册为接待员

问题2:为什么我通过这个.hashCode实例看到20个路由器都使用相同的ActorA?通过文件配置路由器的正确方法是什么,以便它将消息发送到20个路由器中的一个,而不管是本地的还是远程的?还是我创造20条路线的方式错了?需要20个路由来平衡负载

问题3:如果我使用以下配置,调试日志中似乎只有一个路由器,为什么?这是因为最佳尺寸调整器吗?那么它丢弃的实例数=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
    }
  }
}

谢谢

首先需要给你一些概念,看来你误解了

实例数量=20与实例最大总数量=20相同,见以下说明:

将部署的路由的最大数量(总计) 在所有节点上。另请参见每个节点的最大实例数说明。 出于向后兼容性的原因,实例的数量 与群集实例的最大总数量的目的相同 感知路由器和实例的nr(如果由用户定义) 优先于实例的最大总数量

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

1每个节点的最大实例数=20,解释如下:

将部署在每个群集上的最大路由数 成员节点。 请注意,最大实例总数定义路由的总数,但 不会超过每个节点的路由人数,即如果 定义实例的最大总数量=50,每个节点的最大实例数量=2 它将为集群中的每个新成员部署2个路由,最多 25名成员

2您拥有的群集成员数

在这里,您的情况是:

群集节点的数量=1

每个节点的最大实例数=20

因此,总路由是群集节点的nr*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);
上面的代码将为您创建一个路由器参与者,并使用ActorA实例作为您的路由对象。然后,对于您的场景,将生成20个参与者,当您向接待员发送消息时,消息将被发送到路由器,路由器将根据路由器类型选择一个路由器来处理消息

接下来解释你的问题:

第一季度:

使用该代码,并不像您预期的那样,它不会设置20个路由器,它只会为您设置一个路由器,详细信息请参见上述说明。所以只有一个路由器注册给接待员

第二季度:

我认为你看不到20个路由器,同时,我认为你也看不到20个路由器。使用代码ActorRef someactor=system.actorOfProps.createSomething.class,ActorA;,您所看到的只是创建了一个参与者,而这不是由路由器参与者创建的。仅使用一个actor实例,您肯定只会看到相同的actor hashcode。您的application.conf是正确的,只是您的理解是错误的,代码是错误的

第三季度:

再一次,不是一个路由器,你看到一个路由器。这是因为代码ActorRef someactor=system.actorOfProps.createSomething.class,ActorA;,您已经自己创建了一个routee

使用router=cluster metrics adaptive group,这意味着路由器不会为您创建routee,它将使用现有的routee,您只需将其设置为routees.path=[/user/ActorA],这里您只需设置一个routee参与者