为每个域对象创建参与者
Creating actor per domain object
我一直在尝试使用带有 ConsistentHashingPool
的路由器来动态创建参与者以根据对象 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
中的值似乎也会破坏某些东西,这意味着散列可能只适用于初始实例集并且没有产生新的参与者?我以为调整器应该能帮到我?
请原谅我的天真,我才刚刚开始使用Akka
这里的关键是了解路由器的真正作用。一致性哈希意味着,给定所有可能的一致性哈希值范围,路由器池中的每个参与者负责处理总可能性范围中的哈希范围。
例如:如果您的一致性哈希值可以是 1-100 可能范围内的值之一,则具有 10 个参与者池的一致性哈希路由器会将具有 1-10 哈希值的消息委托给第一个参与者 11 -20 到第二个,依此类推...一旦您调整池的大小,这些哈希范围将重新调整到池中的每个演员 - 所以在这种情况下,在将池大小调整为 20 个演员后,第一个将现在服务范围从 1-5,第二个 6-10 等
如果您想即时创建演员并根据某个实体 ID 将消息路由给他们,我相信您正在寻找的东西是 Akka.Cluster.Sharding。
我一直在尝试使用带有 ConsistentHashingPool
的路由器来动态创建参与者以根据对象 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
中的值似乎也会破坏某些东西,这意味着散列可能只适用于初始实例集并且没有产生新的参与者?我以为调整器应该能帮到我?
请原谅我的天真,我才刚刚开始使用Akka
这里的关键是了解路由器的真正作用。一致性哈希意味着,给定所有可能的一致性哈希值范围,路由器池中的每个参与者负责处理总可能性范围中的哈希范围。
例如:如果您的一致性哈希值可以是 1-100 可能范围内的值之一,则具有 10 个参与者池的一致性哈希路由器会将具有 1-10 哈希值的消息委托给第一个参与者 11 -20 到第二个,依此类推...一旦您调整池的大小,这些哈希范围将重新调整到池中的每个演员 - 所以在这种情况下,在将池大小调整为 20 个演员后,第一个将现在服务范围从 1-5,第二个 6-10 等
如果您想即时创建演员并根据某个实体 ID 将消息路由给他们,我相信您正在寻找的东西是 Akka.Cluster.Sharding。