Akka.NET ConsistentHashingPool:为每个哈希创建路由
Akka.NET ConsistentHashingPool: create routee per hash
是否可以强制ConsistentHashingPool为每个哈希创建路由?我希望一个 routee actor 只处理相同散列的消息。如果有新的哈希值进来,就会创建新的路由。
我尝试研究 Resizer
class,但我无法找到实现我想要的东西的方法。
我认为您对 ConsistentHashRouter (CHR) 有点误解。它已经做了您所说的事情——始终如一地将其密钥落在给定哈希范围内的消息路由到同一个路由。
当新 nodes/virtual 节点加入集群时,路由被添加到 CHR 路由 table 或从中删除。然后,哈希范围将重新平衡以考虑集群中的新节点,并且 CHR 会将消息路由到现在负责密钥所在的哈希范围部分的节点。这可能是之前负责它的同一个节点,也可能从一个节点转移到另一个节点。本质上,您是在整个集群中对哈希范围进行分片。
更新:截至撰写本文时(2015 年 10 月),此管理过程必须手动完成。有一个名为 Akka.Cluster.Sharding 的模块,它将为您跨节点重新平衡分片。它目前在 JVM 上可用。
(从新手的角度...)
我同意 Oliver 的观点,这太简单了 use-case 需要 称为集群和分片的东西。
考虑一个 actor 为用户或会话或其他东西保持某种状态 - 显然每个 actor 必须只接收该 entity-instance-id 的消息。
通过阅读一些文档,我很确定自己编写代码是微不足道的:您只需编写一个父 actor 来检查给定 id 的子对象是否存在,如果不存在则创建它,然后将消息路由到它。
我还希望 ConsistentHashingRouter 上有类似 create-unique-actors 的设置来自动为您执行此操作。 (也许它不是一般有用的,因为你需要考虑何时以及如何终止演员以防止他们永远活着?)
是否可以强制ConsistentHashingPool为每个哈希创建路由?我希望一个 routee actor 只处理相同散列的消息。如果有新的哈希值进来,就会创建新的路由。
我尝试研究 Resizer
class,但我无法找到实现我想要的东西的方法。
我认为您对 ConsistentHashRouter (CHR) 有点误解。它已经做了您所说的事情——始终如一地将其密钥落在给定哈希范围内的消息路由到同一个路由。
当新 nodes/virtual 节点加入集群时,路由被添加到 CHR 路由 table 或从中删除。然后,哈希范围将重新平衡以考虑集群中的新节点,并且 CHR 会将消息路由到现在负责密钥所在的哈希范围部分的节点。这可能是之前负责它的同一个节点,也可能从一个节点转移到另一个节点。本质上,您是在整个集群中对哈希范围进行分片。
更新:截至撰写本文时(2015 年 10 月),此管理过程必须手动完成。有一个名为 Akka.Cluster.Sharding 的模块,它将为您跨节点重新平衡分片。它目前在 JVM 上可用。
(从新手的角度...)
我同意 Oliver 的观点,这太简单了 use-case 需要 称为集群和分片的东西。
考虑一个 actor 为用户或会话或其他东西保持某种状态 - 显然每个 actor 必须只接收该 entity-instance-id 的消息。
通过阅读一些文档,我很确定自己编写代码是微不足道的:您只需编写一个父 actor 来检查给定 id 的子对象是否存在,如果不存在则创建它,然后将消息路由到它。
我还希望 ConsistentHashingRouter 上有类似 create-unique-actors 的设置来自动为您执行此操作。 (也许它不是一般有用的,因为你需要考虑何时以及如何终止演员以防止他们永远活着?)