【问题标题】:Why is the parent's name used as part of the PersistenceId in Akka Sharding?为什么在 Akka Sharding 中将父名称用作 PersistenceId 的一部分?
【发布时间】:2019-02-01 19:03:12
【问题描述】:

我在查看分片 example 并注意到父级的名称被用作 PersistenceId 的一部分?

PersistenceId = Context.Parent.Path.Name + "-" + Self.Path.Name;

我的问题:

  1. 父母的名字是 ShardId 吗?

  2. 使用它的目的是什么?它的作用类似于复合键吗?

  3. 我的 EntityId 是一个 guid,我的 MessageExtractor 继承自 HashCodeMessageExtractor 类。由于这将为我提供基于 PersistenceId/Guid 的 ShardId 的一致哈希,我是否仍需要使用父名称作为 PersistenceId 的一部分?另外,同一个 guid 的哈希值是否会根据不同的构造函数值(maxNumberOfShards)而变化?

【问题讨论】:

    标签: akka.net akka-cluster akka-persistence


    【解决方案1】:

    此示例特定于 Akka.Cluster.Sharding。虽然由集群分片扩展管理,但分片的 actor(称为实体)仍然放置在标准的 akka actor 层次结构树下。它看起来或多或少是这样的:

    • ShardRegion (name=typeName)
      • 分片(名称=shardId
        • 实体(名称=entityId

    虽然你的 actor 是这棵树中的实体部分,但其余部分由 Akka.Cluster.Sharding 插件创建。

    另一部分是在集群中本地化实体的一种方式。对于此 Akka.Cluster.Sharding 使用 (shardId,entityId) 形式的复合键。总是。

    1. 在某些情况下 - 例如使用 HashCodeMessageExtractor 时,您已经提到 - shardId 仅基于 entityId 生成/计算。在这种情况下,您不需要在任何地方包含它, entityId 就足够了。使用HashCodeMessageExtractor 的缺点是您必须预先提供最大分片数:脑死亡规则是使用您希望在集群中拥有的 10 * max-number-of-nodes
    2. 其他情况可能需要两个 ID 来唯一标识一个实体。示例中就是这种情况,因此我们查找 shardId(通过查看我提供的层次结构,以父名称编码)以组合成 persistentId。

    您可以找到有关构建分片 ID here 的更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-07
      • 2015-02-01
      • 2011-12-10
      • 2011-02-08
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多