【问题标题】:Akka.NET ConsistentHashingPool: create routee per hashAkka.NET ConsistentHashingPool:为每个哈希创建路由
【发布时间】:2015-10-01 18:41:44
【问题描述】:

是否可以强制ConsistentHashingPool 为每个哈希创建路由?我希望一个 routee 演员只处理相同哈希的消息。如果有新的 hash 进来,就会创建新的 routee。

我尝试查看 Resizer 类,但我无法找出实现我想要的东西的方法。

【问题讨论】:

    标签: akka.net


    【解决方案1】:

    我认为您对ConsistentHashRouter (CHR) 有点误解。它已经完成了您所说的 - 始终将密钥落在给定哈希范围内的消息路由到相同的路由。

    当新节点/虚拟节点加入集群时,路由被添加到 CHR 路由表中/从中删除。然后,哈希范围将重新平衡以考虑集群中的新节点,并且 CHR 会将消息路由到现在负责密钥所属哈希范围部分的节点。这可能是之前负责它的同一节点,或者它可能从一个节点转移到另一个节点。本质上,您是在整个集群中对哈希范围进行分片。

    更新:截至撰写本文时(2015 年 10 月),此管理过程必须手动完成。有一个名为 Akka.Cluster.Sharding 的模块会为您跨节点重新平衡分片。它目前在 JVM 上可用。

    【讨论】:

    • 我知道它将消息路由到相同的路由。但是正如您所说,routee 负责范围,而不是特定的哈希。而且我希望每个哈希都有路由。在您的文档中的图表上,可以说 B Z X A 是哈希,而不是消息。我希望将哈希 B 发送到另一个“动态”创建的路由。 Diagram 对我来说,看起来我已经混合了两个不同的问题。
    • @derwasp 我认为,您要求解决一致哈希的问题,而您真正要寻找的是集群分片 - 这是一个处于开发阶段的模块(目前写此评论),它将能够自动在集群上创建和重新平衡参与者,并通过特定的 ID 向他们发送消息。您已经可以在 JVM 上的 akka 中看到它。
    • @Horusiath 谢谢!在查看了 JVM akka 的文档之后,看起来这就是我需要的东西。因为我不着急,所以会等待它准备好;)虽然我不能接受你的评论作为答案。因此,要么您将其发布为答案,要么我将接受 Andrew 的。
    • 是的,@Horsiath 是对的。集群分片——一旦可用——将为你完成我上面描述的事情。我会将其添加到我的答案中。
    • 对于这样一个简单的用例,对我来说似乎有点矫枉过正。您希望所有具有特定 Id 的消息都由同一个参与者处理。如果它不存在,则创建它。就这么简单。您真的必须为此使用集群和其他模块吗?
    【解决方案2】:

    (从新手的角度来看...) 我同意 Oliver 的观点,这是一个太简单的用例,需要称为集群和分片的东西。
    考虑一个参与者为用户或会话或其他东西持有某种状态 - 显然每个参与者必须只接收该实体实例 ID 的消息。

    通过阅读一些文档,我很确定自己编写代码很简单:您只需编写一个父 actor 检查给定 id 的子节点是否存在,如果它不存在则创建它,然后路由给它的消息。

    我还希望在 ConsistentHashingRouter 上设置类似于 create-unique-actors 的设置来自动为您执行此操作。 (也许它通常没有用,因为您需要考虑何时以及如何终止演员以防止他们永远活着?)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2021-09-02
    • 2013-09-07
    相关资源
    最近更新 更多