使用Akka.NET

时间:2016-11-18 09:27:46

标签: c# actor akka.net

我正在做一些示例来了解一下Akka.NET。我试图实现一个Child-Per-Entity模式(如Akka.NET Design Patterns所示),其中每个用户有一个actor(跨群集)。

为了做到这一点,我试图使用带有ConsistentHashingPool的ClusterRouterPool,它将消息分发给一些保持IDictionary(int,IActorRef)的父actor,其子actor由它们的id索引(用作一致哈希的键) )。

然而,这种方法似乎并没有像我最初预期的那样工作,因为:

  1. 让不同的客户创建路由器会导致他们创建多个父actor,从而创建重复的子actor。
  2. 即使我有一个路由器,如果新节点加入群集会发生什么?路由器是否会重新平衡自己,导致路由被重新路由到将会创建重复子actor的新父actor?
  3. 在StackOverflow上有一些类似的question指向使用Akka.Cluster.Sharding,但在Akka.NET Design Patterns Aaron有一条评论声明他使用了一致的哈希路由器方法,因此为什么我是在第一时间开始的。

    由于

1 个答案:

答案 0 :(得分:1)

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

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

因此我认为,群集分片是您正在寻找的。在Akka.NET核心存储库的示例部分中,您可能会发现a sample直接解决您的情况。