我有一个与客户角色的测试演员系统。它跟踪客户的状态。事件消息和查询消息将发送到协调器。如果消息不存在Customer actor,则协调器创建一个。工作正常,看起来像这样:
现在我想添加群集。我希望系统对于许多客户来说足够大,当一个人关闭时,消息仍然可以被其他节点处理。所以经过阅读和修补,我以为我知道该怎么做,但我一定是误会。这是我的方法。我在协调器上面添加了一个ConsistentHashingPool actor(使用客户ID作为密钥)。然后,通过使该池集群知晓,它可以将协调器与其客户分发到其他节点。当仍然在一个节点上时,它看起来像这样:
像魅力一样工作。但后来我向集群添加了第二个节点。它看起来像这样:
这不是我想要的。所有客户现在都有两个代表他们的演员。一些事件最终在节点1上,其他事件在节点2上。我显然有一些错误的期望。我有点期望群集感知池在两个节点上都存在"作为一个"。
那么我该怎样做才能实现目标呢?也许应该有调度员角色和州角色?但我仍然想要2名调度员。我应该看看这个Cluster Singleton的东西吗?它指出单身人士很容易成为瓶颈。最好是,我会在每个节点上都有一个路由器,但是它们会共享路由,一些是本地的,一些是远程的。
答案 0 :(得分:1)
要实现您的目标,请不要使用ConsistenHashing群集路由器。这就是Akka.Cluster.Sharding的专用功能。人们已经在很多项目中使用过它。有几篇关于它的文章: