gpt4 book ai didi

c# - Akka.net:访问集群中的远程 Actors

转载 作者:太空狗 更新时间:2023-10-29 23:13:24 25 4
gpt4 key购买 nike

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

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

现在我想通过使用像这样的 ActorSelection 从 node1 的 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]
}
}

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

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

最佳答案

I thought I had location transparency on a Cluster and could reach remote resources as if they where local.

这可没那么简单。考虑以下场景:如果您在同一路径下的两个节点上创建了一个 actor 会怎么样。如果您将尝试使用相对路径 - 不显示您想要的节点 - 哪个参与者应该接收消息?

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

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

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

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

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

关于c# - Akka.net:访问集群中的远程 Actors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35634127/

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