我当时正在查看分片example,并注意到父母的名字被用作PersistenceId的一部分?
PersistenceId = Context.Parent.Path.Name + "-" + Self.Path.Name;
我的问题:
父母的名字是ShardId吗?
使用它的目的是什么?它像复合键一样起作用吗?
我的EntityId是一个GUID,我的MessageExtractor继承自HashCodeMessageExtractor类。由于这将为我提供基于PersistenceId / Guid的ShardId的一致哈希,因此我是否仍需要使用父母名称作为PersistenceId的一部分?另外,相同的GUID的哈希值会根据不同的构造函数值(maxNumberOfShards)改变吗?
答案 0 :(得分:1)
此示例特定于Akka.Cluster.Sharding。尽管由集群分片扩展进行管理,但分片角色(称为实体)仍放置在标准akka角色层次结构树下。看起来或多或少是这样的:
虽然演员是该树的实体部分,但其余部分则由Akka.Cluster.Sharding插件创建。
另一部分是在集群中本地化实体的方法。为此,Akka.Cluster.Sharding使用了( shardId , entityId )形式的复合键。总是。
HashCodeMessageExtractor
时,您已经提到过)shardId仅基于entityId生成/计算。在那种情况下,您不需要在任何地方包含它,entityId就足够了。使用HashCodeMessageExtractor
的缺点是您必须预先提供最大数量的分片:死脑法则是使用您期望曾经拥有的 10 *最大节点数集群。您可以找到有关构建分片ID here的更多详细信息。