我正在使用akka.Net来开发一个插件架构,其中包含一个或多个插件的每个dll都被加载到它自己的AppDomain
中,并且初始化了一个新的actor系统以准备接收来自&#34的消息宿主"
我试图通过多个插件来解决这个问题。
所以主机配置如下:
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
}
}
(其中有很多)
我的问题是如何从主机向所有插件发送消息?
答案 0 :(得分:10)
最好的建议是使用Akka.Cluster。以下是一个记录良好的示例:https://github.com/petabridge/akkadotnet-code-samples/tree/master/Cluster.WebCrawler
编辑 - 删除了使用动态端口的建议。最好使用静态的,这样可以正确处理节点重启。
让每个插件配置使用特定于插件的端口(akka.remote.helios.tcp.port = 1231
),然后定义一个与履行特定角色的actor系统对话的集群路由器。
/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
上部署的任何actor进行通信(通过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地址。阅读文章,了解为什么这很重要。
角色 - 以逗号分隔的字符串,用于定义此特定节点的功能。它们更像是标签。您可以在集群路由器(如我之前展示的那个)中使用它们来阐明您想要与哪些类型的节点通信。