【问题标题】:Akka.net: Access remote Actors in ClusterAkka.net:访问集群中的远程 Actor
【发布时间】:2016-06-08 15:07:36
【问题描述】:

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

我想从 node1 向在 node2 上创建的 Actor 发送消息。 node2上这个节点的本地路径是akka:MyAkkaSystem/user/AnActor。

现在我想使用这样的 ActorSelection 从节点 1 的 Actor 向该特定 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]
    }
  }

作为种子节点,我使用的是灯塔。从连接的角度来看,一切似乎都解决了。种子已经找到,每个节点都收到了欢迎消息。

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

【问题讨论】:

    标签: c# akka cluster-computing remoting akka.net


    【解决方案1】:

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

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

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

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

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

    第二种方法是使用Akka.Cluster.ToolsDistributed Pub/Sub 功能在集群中订阅特定主题的参与者之间广播集群范围的事件,而不用担心他们的实际位置。这是消息广播场景的不错选择。

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

    【讨论】:

    • 谢谢。但是,我认为节点是由于集群八卦而相互连接的。那么如果节点是连接的,为什么不能直接寻址呢?
    • 直接是什么意思?在第一段中,我描述了直接访问节点上的参与者。
    • 您可以从cluster.ReadView.Members 轻松提取此信息 - 它们已经包含有关每个集群节点的地址和角色的信息。或者你可以使用cluster group routers
    • 就是这样:组路由器。谢谢。
    • 对于最近访问此页面的任何人,ReadView 已从集群对象中贬值,您现在可以使用 State 访问成员列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2015-09-06
    • 2021-08-30
    • 1970-01-01
    • 2016-10-27
    • 2022-07-28
    相关资源
    最近更新 更多