使用以下命令在配置文件中配置群集路由时:
akka.actor.deployment {
/jobDispatcher/singleton/workerRouter {
router = round-robin-pool
nr-of-instances = 5
cluster {
enabled = on
max-number-of-instances-per-node = 1
allow-local-routees = on
}
}
}
我可以使用以下方法查找路由工人:
ActorRef actor = context().actorOf( //
FromConfig.getInstance().props( //
Props.create(MyRoutedActor.class)), //
"workerRouter");
我希望以编程方式配置池,因为我想向用户隐藏详细信息。
但是使用:
ActorRef actor = context().actorOf(new ClusterRouterPool(new RoundRobinPool(5), //
new ClusterRouterPoolSettings(100, 1, true, "")) //
.props(Props.create(MyRoutedActor.class)),
"workerRouter");
不会将呼叫路由到群集中的路由(仅本地路由)。
如何正确配置路由?
最佳答案
尝试使用ClusterRouterPool
Akka doc说[http://doc.akka.io/docs/akka/2.4/scala/cluster-usage.html]:
池-将路由创建为子参与者并将其部署在远程节点上的路由器。每个路由器都有其自己的路由实例。例如,如果您在10节点群集中的3个节点上启动路由器,那么如果将路由器配置为每个节点使用一个实例,则总共有30条路由。由不同路由器创建的路由将不会在路由器之间共享。这种路由器的一个用例示例是单个主机,该主机协调作业并将实际的工作委托给群集中其他节点上运行的路由。
示例http://doc.akka.io/docs/akka/2.4/java/cluster-usage.html#Router_with_Pool_of_Remote_Deployed_Routees
akka.actor.deployment {
/statsService/singleton/workerRouter {
router = consistent-hashing-pool
cluster {
enabled = on
max-nr-of-instances-per-node = 3
allow-local-routees = on
use-role = compute
}
}
}
以编程方式执行的代码(也来自akka docs):
int totalInstances = 100;
int maxInstancesPerNode = 3;
boolean allowLocalRoutees = false;
String useRole = "compute";
ActorRef workerRouter = getContext().actorOf(
new ClusterRouterPool(new ConsistentHashingPool(0),
new ClusterRouterPoolSettings(totalInstances, maxInstancesPerNode,
allowLocalRoutees, useRole)).props(Props
.create(StatsWorker.class)), "workerRouter3");
我在scala中有一个akka集群,这是我的代码:
val workerRouter = context.actorOf(
ClusterRouterGroup(AdaptiveLoadBalancingGroup(MixMetricsSelector), ClusterRouterGroupSettings( //RoundRobinGroup(Nil)
totalInstances = 1000, routeesPaths = List("/user/worker"),
allowLocalRoutees = true, useRole = Some("workerRole"))).props(),
name = "pool")