java - 整个集群上的 Akka ActorSelection

标签 java akka akka-cluster

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

相关文章:

java - 在 Spring Boot 中找不到返回列 'id' 的 SQL 查询

java - 为什么在将文本转换为 java 中的 xls 文件后写入文本时,输出会发生移位

java - 在 Akka 中向 BroadcastGroup 添加新地址

scala - 如何防止喷涂应用过载?

unit-testing - Akka 中的 TestKit、TestActorRef 和 TestProbe 是什么?

spring - Akka Actor 和集群 - 我在使用 ClusterSingletonManager 时遇到问题 - 状态为 Start 的未处理事件

java - Akka 集群 - 每个节点一个 Manager Actor

java - : mappedBy reference an unknown target entity property

Java动态添加按钮作为数组

scala - 找不到 key 'akka.remote.artery' 的配置设置