繁体   English   中英

Akka.net:访问群集中的远程Actor

[英]Akka.net: Access remote Actors in Cluster

在集群环境中,我有一个种子节点以及node1和node2。

我想从node1发送一条消息给已在node2上创建的Actor。 节点2上此节点的本地路径为akka:MyAkkaSystem / user / AnActor。

现在,我想通过像这样的ActorSelection将来自Actor的消息从node1发送到该特定Actor:

var actorSystem = ActorSystem.Create("MyTestSystem");
var c = actorSystem.ActorSelection("/user/ConsoleReceiver");
c.Tell("Hello World");

在node2上,actor的创建方式如下:

var actorSystem = ActorSystem.Create("MyTestSystem");
            var r = actorSystem.ActorOf(Props.Create<MessageReceiver>(), "ConsoleReceiver");
            Console.WriteLine(r.Path);
            Console.ReadLine();
            actorSystem.Terminate().Wait();

不幸的是,由于尝试以无效字母结尾,因此无法解决。

node2上的HOCON配置如下所示:

akka {
    actor {
      provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"                  
      deployment {                  
      }              
    }

    remote {
      log-remote-lifecycle-events = DEBUG
      log-received-messages = on

      helios.tcp {
        transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"
            applied-adapters = []
            transport-protocol = tcp       
        hostname = "127.0.0.1"
        port = 0
      }
    }            

    cluster {
      #will inject this node as a self-seed node at run-time
      seed-nodes = ["akka.tcp://webcrawler@127.0.0.1:4053"] #manually populate other seed nodes here, i.e. "akka.tcp://lighthouse@127.0.0.1:4053", "akka.tcp://lighthouse@127.0.0.1:4044"
      roles = [crawler]
    }
  }

作为种子节点,我正在使用灯塔。 从连接的角度来看,一切似乎都可以解决。 找到了种子,并且获得的每个节点都收到了欢迎消息。

我以为我在群集上具有位置透明性,可以像访问本地资源一样访问远程资源。

我以为我在群集上具有位置透明性,可以像访问本地资源一样访问远程资源。

这不是那么容易。 考虑以下情形: 如果您在同一路径下的两个节点上都创建了一个actor,该怎么办? 如果您尝试使用相对路径-在不显示您想到哪个节点的情况下-哪个演员应该收到消息?

使用基本的群集功能,您可以使用Context.ActorSelection(_cluster.ReadView.Members.Single(m => /* which node you want to choose */).Address + "/user/ConsoleReceiver");轻松选择节点Context.ActorSelection(_cluster.ReadView.Members.Single(m => /* which node you want to choose */).Address + "/user/ConsoleReceiver"); 集群扩展为您提供了一个读取视图数据,其中包含有关当前节点中所有可见成员的信息。

有很多方法可以将消息发送给另一个参与者,而不必知道消息位于哪个节点上。

第一种方法是使用Akka.Cluster.Tools 群集单例功能-它允许您最多创建群集中存在的actor的一个实例。 如果节点发生故障,它将迁移到另一个节点。 请注意,如果您想让许多参与者以这种方式工作,则不应使用此解决方案。 对于独特的,特殊情况的演员而言更是如此。

第二种方法是使用Akka.Cluster.Tools 分布式发布/订阅功能在订阅特定主题的集群中的参与者之间广播集群范围的事件,而不必担心其实际位置。 这是消息广播方案的不错选择。

最后一种方法是使用Akka.Cluster.Sharding功能,该功能可自动管理参与者的生命周期-您无需显式创建参与者-它也能够将消息从群集中的任何位置路由到它们,并可以在需要时在多个群集节点之间重新平衡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM