4

我从 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 上的项目,该问题已被标记为已修复。

4

0 回答 0