如何通过配置文件

时间:2018-06-17 03:58:01

标签: akka akka-cluster

我目前正在学习AKKA,并且在控制受让人数方面存在问题。我正在尝试实现一个集群感知路由器作为接待员的集群,简单的演员作为routee,所有都运行在我的本地进行开发。我有一个  配置如下

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

Q1:我是否将特定路由器实例注册为接待员?或者其中20个?是否有可能/建议将/ 20路由器注册为接待员?

Q2:为什么我看到20个路由器都使用相同的ActorA(通过this.hashCode())实例?配置路由器(通过文件)的正确方法是什么,所以它会向20个路由之一发送消息,无论是本地还是远程?或者我错了创建20条路线的方式? (需要20条路线才能平衡负荷)

问题3:如果我使用以下配置,调试日志中似乎只有1个路由器,为什么?是因为最佳尺寸探索尺寸调整器?所以它丢弃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
    }
  }
}

由于

1 个答案:

答案 0 :(得分:1)

首先需要给您一些概念,看来您误会了。

nr-of-instances = 20max-total-nr-of-instances = 20相同,请参见以下说明:

  

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

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

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

  

将在每个群集上部署的最大路由数   成员节点。   请注意,max-total-nr-of-instances定义了路由总数,但是   每个节点的路由数不会超过,即   定义实例的最大总nr = 50和每个节点的实例的最大nr = 2   它将为群集中的每个新成员部署2条路由,直至   25个成员。

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个参与者,当您将消息发送给接待员时,该消息将发送到路由器,并且路由器将选择一个路由来处理消息(取决于路由器类型)。

接下来解释您的问题:

对于第一季度:

使用代码,不会像您期望的那样设置20台路由器,只会为您设置一台路由器,详细信息请参见上面的说明。因此只有一个路由器注册给了接待员。

第二季度:

我认为您看不到20个路由器,同时,我也看不到20条路由。使用您的代码ActorRef someactor=system.actorOf(Props.create(Something.class), "ActorA");,仅创建了一个参与者,而router actor并未创建。仅使用一个actor实例,您肯定会看到相同的actor哈希码。您的application.conf是正确的,只是您的理解是错误的,并且您的代码是错误的。

对于第三季度:

同样,您看到一个路由,而不是一台路由器。这是因为使用代码ActorRef someactor=system.actorOf(Props.create(Something.class), "ActorA");,您可以自己创建一个路由。

对于router = cluster-metrics-adaptive-group,这意味着router不会为您创建routee,它将使用现有的routee,您只需将其设置为routees.paths = ["/user/ActorA"],在这里,您只设置了一个角色演员。