为什么在Akka Sharding中将父母的名字用作PersistenceId的一部分?

时间:2019-02-01 19:03:13

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

我当时正在查看分片example,并注意到父母的名字被用作PersistenceId的一部分?

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

我的问题:

  1. 父母的名字是ShardId吗?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

虽然演员是该树的实体部分,但其余部分则由Akka.Cluster.Sharding插件创建。

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

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

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