为什么 parent 的名称用作 Akka 分片中 PersistenceId 的一部分?

Why is the parent's name used as part of the PersistenceId in Akka Sharding?

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

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

我的问题:

  1. parent的名字是ShardId吗?

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

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

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

  • ShardRegion (名称=类型名称)
    • 分片(名称=shardId
      • 实体(名称=entityId

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

另一部分是在集群中定位实体的方法。为此 Akka.Cluster.Sharding 使用形式为 (shardId,entityId) 的组合键。总是。

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

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