我一直在尝试使用带有ConsistentHashingPool
的路由器来动态创建actor以根据对象ID消费消息,在这个简单的例子中,它是一个唯一的字符串。
我想要每个域聚合的演员,这似乎是一种非常简单的方法。
但是哈希似乎做了一些奇怪的事情并向已经从不同哈希映射值产生的actor发送消息。
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
中的值似乎也会破坏事物,这意味着哈希可能只适用于初始实例集并且没有新的actor被生成?我认为缩放器应该在这里帮助我吗?
请原谅任何天真,我刚刚开始使用Akka。
答案 0 :(得分:5)
这里的关键是要了解路由器的真正用途。一致的散列方法,给定所有可能的一致散列值的范围,路由器池中的每个参与者负责处理总可能性范围内的哈希范围。
例如:如果您的一致哈希可以是1-100的可能范围内的值之一,则具有10个actor的池的一致哈希路由器将委托具有1-10的哈希的消息给第一个actor,11-20到第二个,依此类推......一旦你要调整池的大小,这些哈希范围将被重新调整到池中的每个actor - 所以在这种情况下,在将池调整为20个actor后,第一个将立即服务范围从1-5,第二个6-10等
如果你想动态创建演员并根据某个实体ID将消息路由给他们,我相信你要找的是Akka.Cluster.Sharding。