我目前正在学习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
}
}
}
由于
答案 0 :(得分:1)
首先需要给您一些概念,看来您误会了。
nr-of-instances = 20
与max-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"]
,在这里,您只设置了一个角色演员。