使用Akka.NET在集群中为每个用户实现一个actor(每个实体的子模式)

问题描述:

我正在做一些示例以了解一些关于Akka.NET的内容。我试图实现每个实体的子模式(如Akka.NET Design Patterns所示),其中每个用户有一个角色(跨群集)。使用Akka.NET在集群中为每个用户实现一个actor(每个实体的子模式)

要做到这一点,我试图使用ConsistentHashingPool的一个ClusterRouterPool,它将消息分发给一些父类actor,这些父类actor通过id代表索引的child actors(int,IActorRef)(用作一致性的关键字哈希值)。

这种方法却似乎并没有工作,当我最初预期,因为:

  1. 具有不同的客户创造的路由器,将导致在创建多个父演员,这反过来会造成重复的儿童演员。
  2. 即使我有一台路由器,如果新节点加入集群会发生什么?路由器不会重新平衡自己,从而导致再次创建路由到新的父母角色,从而产生重复的子角色?

有几分相似question这里*上指向使用Akka.Cluster.Sharding,但Akka.NET Design Patterns亚伦有评论指出,他使用一致性哈希路由器的方法,因此为什么我在第一时间启动它。

感谢

+0

仅供参考,我将示例添加到[GitHub](https://github.com/joaofbantunes/AkkaSample) – joaofbantunes

我认为,关键的概念是理解Akka.Cluster.Sharding和一致性哈希路由器之间的区别:

  • Akka.Cluster.Sharding消息演员路由基于(ShardId,EntityId)标识符。这是1对1的关系,这意味着具有不同标识符的消息将始终被路由到他们的专用角色。此外,群集分片将保证,即使群集中的节点数量将发生变化,邮件也会正确发送给其参与者。
  • 一致的散列路由器方法重要的是要理解的是关键空间的概念 - 它是所有可能的消息标识符的空间接收。然后这个空间除以路由器后面的参与者数量 - 这意味着每个参与者不与一个标识符相关联,而是与其范围相关联。这是一对多的关系,所以有可能两个具有不同id的消息将被路由到同一个actor。此外,随着群集中节点的数量将发生变化,该路由器后面的参与者数量也将发生变化 - 因此,演员的密钥范围并不固定,并且可能随时间而改变。这意味着当群集大小改变时,具有相同标识符的消息可能被路由到不同的参与者。

因此,我认为,群集分片就是你要找的。在Akka.NET核心存储库的示例部分中,您可以找到a sample,它可以直接解决您的问题。

+0

谢谢。我确实去过Akka.NET的样本,但没有进入Sharding样本,所以我错过了你指出的那个样本。 鉴于Aaron的评论我认为这将是可行的与一致的哈希路由器(与路由器和实际实体之间的中间父行为),但也许这只是一个选项,而不是在集群模式。 – joaofbantunes