gpt4 book ai didi

java - 整个集群上的 Akka ActorSelection

转载 作者:行者123 更新时间:2023-11-30 07:23:58 25 4
gpt4 key购买 nike

我有一个简单的集群,每个节点上都有一个名为“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com