如何使用 Akka.Net 集群仅在一个节点上拥有一个实体并让消息从所有节点到达那里

How to use Akka.Net Cluster to have an entity on only one node and have messages arrive there from all nodes

我有一个包含客户演员的测试演员系统。它跟踪客户的状态。事件消息和查询消息被发送到协调器。如果消息不存在 Customer actor,则 Coordinator 会创建一个。工作正常,看起来像这样:

现在我想添加集群。我希望系统对许多客户来说足够大,并且当一个出现故障时,消息仍然可以由其他节点处理。所以在阅读和修改了一下之后,我以为我知道该怎么做,但我一定是误会了。这是我的方法。我在协调器上方添加了一个 ConsistentHashingPool actor(使用客户 ID 作为键)。然后通过让该池集群感知,它可以将协调器及其客户分发到其他节点。当仍在一个节点上时,它看起来像这样:

工作得很好。但后来我向集群添加了第二个节点。然后看起来像这样:

这不是我想要的。所有客户现在都有两个演员代表他们。有些事件在节点 1 上结束,其他事件在节点 2 上结束。我显然有一些错误的期望。我有点希望集群感知池出现在两个节点 "as one" 上。

那么我应该怎么做才能实现我的目标呢?也许应该有调度员角色和状态角色?但那时我仍然想要 2 个调度员。我应该研究这个 Cluster Singleton 吗?它指出单例很容易成为瓶颈。最好,我会在每个节点上都有一个路由器,但它们会共享路由,一些是本地的,一些是远程的。

为了达到你想要的效果,请不要使用 ConsistenHashing 集群路由器。有一个名为 Akka.Cluster.Sharding 的专用功能。人们已经在很多项目中使用过它。有几篇关于它的文章: