我一直在尝试使用带有ConsistentHashingPool
的路由器来创建动态参与者,以在对象id的基础上消费消息,在这种简单的情况下,对象id是一个唯一的字符串。
我想要一个每个域的参与者聚合,这似乎是一个非常简单的方法
但哈希似乎在做一些奇怪的事情,并向已经从不同的哈希映射值派生出的参与者发送消息。
ActorSystem.ActorOf(
Props.Create(() => new MyAggergateActor()).WithRouter(
new ConsistentHashingPool(10)
.WithHashMapping(o => (o as MyEvent)?.MyAggregateUniqueId ?? string.Empty)
.WithResizer(new DefaultResizer(1, int.MaxValue))),
"myAggregateRouter");
此外,从nrOfInstances
中调整值似乎也会打破局面,这意味着哈希可能只在一组初始实例中起作用,并且没有产生新的参与者?我以为整形医生应该在这里帮我?
请原谅我的天真,我才刚刚开始使用阿卡。
这里的关键是了解路由器真正的作用。一致哈希意味着,在给定所有可能的一致哈希值的范围内,路由器池中的每个参与者都负责处理总可能性范围内的哈希范围。
例如:如果您的一致性哈希可以是1-100的可能范围中的一个值,则具有10个参与者池的一致性散列路由器将使用1-10到第一个参与者、11-20到第二个参与者的哈希委托消息,依此类推…一旦您调整池的大小,这些哈希范围将重新调整到池中的每个参与者-因此在这种情况下,在将池的大小调整为20个参与者之后,第一个将提供1-5,第二个6-10等范围的
如果你想创建动态参与者,并根据某个实体ID将消息路由到他们,我相信你正在寻找的是Akka.Cluster.Sharding.