我有一个简单的集群,每个节点上都有一个名为“service”的服务参与者。该服务分别通过 ClusterClientRecptionist
公开,以便能够通过 ClusterClient
从集群外部使用 ist。
然后,客户端注册用户,这些用户是在集群的随机节点上创建的(因为 ClusterClient
随机调度)。例如,节点 1 上的 /user/service/user1
和节点 2 上的 /user/service/user2
。
我现在想做的是向所有注册用户发送消息,无论他们的物理位置如何。我认为通过使用像 /user/service/*
这样的 ActorSelection
很容易。但这只能解析相应节点上的本地 acotr。
顺便说一句,我使用 Java。
最佳答案
选项 1
我刚刚通过使用 DistributedPubSubMediator
解决了这个问题,如 this question 中所述。并记录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());
关于java - 整个集群上的 Akka ActorSelection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37086737/