我有一个简单的集群,其服务人员名为" service"在每个节点上。此服务分别以ClusterClientRecptionist
公开,以便能够使用ClusterClient
群集外部的ist。
然后,客户端注册在群集的随机节点上创建的用户(因为ClusterClient
随机调度)。例如,node1上的/user/service/user1
和node2上的/user/service/user2
。
我现在要做的是向所有注册用户发送消息,而不管他们的实际位置如何。我很容易使用像ActorSelection
这样的/user/service/*
。但这只能解析相应节点上的本地acotrs。
我顺便使用Java。
答案 0 :(得分:1)
选项1
我刚刚使用this question中描述的DistributedPubSubMediator
解决了问题,并记录了here。
private ActorRef mediator = DistributedPubSub.get(getContext().system()).mediator();
@Override
public void onReceive(Object msg) throws Exception {
String msgStr = msg.toString();
String val = msgStr.substring(4);
if (msgStr.startsWith("add")) {
ActorRef act = context().actorOf(Props.create(User.class, val), val);
// subscribe the newly created user on topic "allUsers"
mediator.tell(new DistributedPubSubMediator.Subscribe("allUsers", act), self());
System.out.println("user created: " + act);
} else if (msgStr.startsWith("say")) {
// broadcast text message to all subscribed users
mediator.tell(new DistributedPubSubMediator.Publish("allUsers", new Text(val)), self());
}
}
选项2
第二个成功的选择是使用BroadcastGroup路由器。重要的是,在配置中启用了群集:
akka.actor.deployment {
/allUsers {
router = broadcast-group
routees.paths = ["/user/service/*"]
cluster {
enabled = on
allow-local-routees = on
}
}
}
之后,它可以直接用于记录。
ActorRef allUsers = system.actorOf(FromConfig.getInstance().props(), "allUsers");
[...]
allUsers.tell(new Text(val), self());