【发布时间】:2018-06-08 02:30:26
【问题描述】:
我不明白在 ShardRegion 中创建新演员时如何分配 ID,我正在查看这个示例
如果有人有更清晰的例子那就太好了。
【问题讨论】:
标签: c# visual-studio sharding akka.net
我不明白在 ShardRegion 中创建新演员时如何分配 ID,我正在查看这个示例
如果有人有更清晰的例子那就太好了。
【问题讨论】:
标签: c# visual-studio sharding akka.net
所有针对分片参与者(实体)的消息都必须通过负责给定实体类型的分片区域。一个分片区域可以这样初始化:
var sharding = ClusterSharding.Get(system);
var shardRegion = sharding.Start(
typeName: nameof(MyActor),
entityProps: Props.Create<MyActor>(), // the Props used to create entities
settings: ClusterShardingSettings.Create(system),
messageExtractor: messageExtractor
);
为了正确地将消息路由到实体,分片区域必须能够提取该实体的 shard-id 和 entity-id 以及它所属的分片。这是messageExtractor 对象的工作(它必须实现IMessageExtractor 接口)。
这里的一个常见模式是创建一个专用信封,用于将实际消息路由到实体。下面你可以看到一个示例 - 分片 id 没有明确提供,而是根据实体 id 以最大分片数为模的哈希计算得出(这个值一旦被选取,就永远不会改变)。
public sealed class ShardEnvelope
{
public readonly string EntityId;
public readonly object Payload;
public ShardEnvelope(string entityId, object payload)
{
EntityId = entityId;
Payload = payload;
}
}
public sealed class MessageExtractor : HashCodeMessageExtractor
{
public MessageExtractor(int maxNumberOfShards) : base(maxNumberOfShards) { }
public override string EntityId(object message) =>
(message as ShardEnvelope)?.EntityId;
public override object EntityMessage(object message) =>
(message as ShardEnvelope)?.Payload;
}
现在,虽然实体生命周期完全由集群分片管理,并且它们在集群中的实际位置可能会随着时间而改变(由于重新平衡),但它们在给定集群节点内的相对路径始终保持不变,并且符合以下规定模式:
/user/sharding/<typeName>/<shard-id>/<entity-id>
这意味着,如果要提取当前actor的entity-id和shard-id,可以直接从actor的路径中提取:
var entityId = Self.Path.Name;
var shardId = Self.Path.Parent.Name;
【讨论】: