0

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

独立的

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

一个节点上的池

像魅力一样工作。但后来我向集群添加了第二个节点。然后它看起来像这样:

在两个节点上

这不是我想要的。所有客户现在都有两个演员代表他们。一些事件最终在节点 1 上结束,其他事件在节点 2 上结束。我显然有一些错误的期望。我有点期望集群感知池“作为一个”存在于两个节点上。

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

4

1 回答 1

1

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

于 2017-11-11T18:33:48.387 回答