我从 Akka.net WebCrawler学习并创建了自己的集群测试。我有一个处理器节点(控制台应用程序)和一个 API 节点(SignalR)。以下是配置。
处理器节点:
akka {
actor{
provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
deployment {
/dispatcher/signalR {
router = broadcast-group
routees.paths = ["/user/signalr"]
cluster {
enabled = on
#max-nr-of-instances-per-node = 1
allow-local-routees = false
use-role = api
}
}
}
}
remote {
log-remote-lifecycle-events = DEBUG
helios.tcp {
port = 0
hostname = 127.0.0.1
}
}
cluster {
seed-nodes = ["akka.tcp://stopfinder@127.0.0.1:4545"]
roles = [processor]
}
}
API 节点:(非种子节点的端口 = 0)
akka {
actor{
provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
}
remote {
log-remote-lifecycle-events = DEBUG
helios.tcp {
port = 4545
hostname = 127.0.0.1
}
}
cluster {
seed-nodes = ["akka.tcp://stopfinder@127.0.0.1:4545"]
roles = [api]
}
}
在 API 节点内部,我创建了一个名为 SignalR 的普通参与者。
在处理器节点内部,我创建了一个普通actor,并将调度程序用于Tell()
API 节点的signalR actor 一些字符串。
当我有一个处理器和一个 API 时,这很有效。当我有多个处理器节点和一个 API 节点时,它也可以工作。不幸的是,当我有多个 API 节点时,无论我如何设置配置,“tell”都不会告诉所有 API 节点;该消息仅发送给其中一个。哪个节点接收消息取决于 API 节点启动顺序。似乎我在集群中正确注册了所有 API 节点,但我可能是错的。
我开始觉得这是一个配置或理解问题。任何人都可以分享任何见解吗?
我做了一些额外的测试。当我用普通控制台应用程序替换 ASP.NET SignalR API 节点时,行为保持不变。
更新:我联系了 Akka.NET 团队。此行为是一个已知错误。它将在 1.1 版本中修复。 更新 2:对于 GitHub 上的项目,该问题已被标记为已修复。