【问题标题】:Akka ActorSelection over a whole cluser整个集群上的 Akka ActorSelection
【发布时间】:2016-05-07 09:20:11
【问题描述】:

我有一个简单的集群,每个节点上都有一个名为“service”的服务参与者。该服务分别暴露为ClusterClientRecptionist,以便能够使用ClusterClient从集群外部使用ist。

然后客户端注册用户,这些用户是在集群的随机节点上创建的(因为ClusterClient 是随机分派的)。例如节点1 上的/user/service/user1 和节点2 上的/user/service/user2

我现在想做的是向所有注册用户发送一条消息,无论他们的实际位置如何。我认为使用ActorSelection 就像/user/service/* 这样很容易。但这只会解决相应节点上的本地 acotrs。

顺便说一句,我使用 Java。

【问题讨论】:

    标签: java akka akka-cluster


    【解决方案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

    第二个成功的选择是使用广播组路由器。重要的是在配置中启用了集群:

    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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 2014-04-12
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多