如何通过配置文件正确设置 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
我目前正在学习 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