6

我正在使用 akka.Net 开发一个插件架构,其中包含一个或多个插件的每个 dll 都被加载到自己的AppDomain中,并且初始化一个新的参与者系统,准备从“主机”接收消息。

我试图让它与多个插件一起工作时变得不稳定。

所以主机配置看起来像:

akka {
    actor {
        provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
    }
    remote {
        helios.tcp {
            transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote""
            applied-adapters = []
            transport-protocol = tcp
            port = 50003
            hostname = localhost
        }
    }
}

插件配置如下所示:

akka {
    actor {
        provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
    }
    remote {
        helios.tcp {
            transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote""
            applied-adapters = []
            transport-protocol = tcp
            port = 50004
            hostname = localhost
    }
}

(其中有很多)

我的问题是如何从主机获取消息到所有插件?

4

1 回答 1

10

最好的建议是使用 Akka.Cluster。这是一个有据可查的示例:https ://github.com/petabridge/akkadotnet-code-samples/tree/master/Cluster.WebCrawler

编辑 - 删除了使用动态端口的建议。使用静态的要好得多,因此可以正确处理节点重新启动。

让每个插件配置使用插件特定的端口 ( akka.remote.helios.tcp.port = 1231),然后定义一个集群路由器,与履行特定角色的参与者系统对话。

/api/broadcaster {
  router = broadcast-group
  routees.paths = ["user/api"]
  cluster {
      enabled = on
      max-nr-of-instances-per-node = 1
      allow-local-routees = on
      use-role = crawler
  }
}

该路由器部署在user/api/broadcaster某个节点的路径上,可以(通过Broadcast路由策略)与部署在user/api集群中具有角色的任何节点上的路径上的任何参与者通信,crawler而无需查找 IP 地址、端口或任何此类废话。

您可以通过 Akka.NET 配置中的以下部分配置节点的集群信息:

cluster {
  #manually populate other seed nodes here, i.e. "akka.tcp://lighthouse@127.0.0.1:4053"
  seed-nodes = ["akka.tcp://webcrawler@127.0.0.1:4053"]
  roles = [crawler]
}

种子节点- 必须是众所周知的、静态定义的端口和 IP 地址。阅读文章,了解为什么这很重要。

角色- 定义此特定节点功能的逗号分隔字符串。它们更像是标签。你可以在集群路由器中使用它们(就像我之前展示的那样)来明确你想要与哪些类型的节点通信。

于 2015-03-19T19:07:42.560 回答