【问题标题】:How can assign an EntityID to an entity of a shard in Akka.NET?如何将 EntityID 分配给 Akka.NET 中的分片实体?
【发布时间】:2018-06-08 02:30:26
【问题描述】:

我不明白在 ShardRegion 中创建新演员时如何分配 ID,我正在查看这个示例

https://github.com/akkadotnet/akka.net/tree/dev/src/examples/Cluster/ClusterSharding/ClusterSharding.Node

如果有人有更清晰的例子那就太好了。

【问题讨论】:

    标签: c# visual-studio sharding akka.net


    【解决方案1】:

    所有针对分片参与者(实体)的消息都必须通过负责给定实体类型的分片区域。一个分片区域可以这样初始化:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多