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

问题描述:

我有一个包含客户参与者的测试角色系统。它跟踪客户的状态。事件消息和查询消息被发送到协调器。如果消息中没有Customer actor,则协调员创建一个。做工精细,看起来像这样:如何使用Akka.Net群集仅在一个节点上拥有一个实体,并且从所有节点都有消息到达

standalone

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

pool on one node

工作就像一个魅力。但后来我添加了第二个节点到集群。然后,它是这样的:

on two nodes

这不是我想要的。所有客户现在都有两名代表他们的演员。一些事件最终发生在节点1上,另一些发生在节点2上。我显然有一些错误的期望。我排序的期望集群感知池在两个节点上“一体”存在。

那么我应该怎么做才能实现我的目标?也许应该有调度员角色和国家角色?但我仍然想要2个调度员。我应该看看这个Cluster Singleton的东西吗?它表示单身人士很容易成为瓶颈。最好,我会在每个节点上都有一个路由器,但他们会共享路由,一些本地和一些远程。

要实现您想要的功能,请不要使用ConsistenHashing集群路由器。有一个称为Akka.Cluster.Sharding的专用功能。它已被不少项目的人们使用过。有关于它的几篇文章:

+0

谢谢,这显然是我错过了什么。我在文档中略过了这个主题,但总结(“当你想使用它们的逻辑ID联系集群参与者,但不想关心它们在集群内的物理位置或者管理它们的创建”),听起来像我正在寻找的东西。 –