2017-12-27 16 views
-1

私はあなたがShardRegionに新しい俳優を作成するときにアサインされているどのようにIDが理解していない誰かが素晴らしいことだ、より明確な例を持っている場合、私はこの例をAkka.NETのシャードのエンティティにEntityIDを割り当てるにはどうすればいいですか?

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

を探していました。

答えて

0

シャードされたアクター(エンティティ)をターゲットとするすべてのメッセージは、エンティティの種類に関係するシャードリージョンを経由しなければなりません。シャード領域は、次のように初期化することができます。

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 
); 

エンティティに正しくルーティングメッセージをするためには、シャード領域はシャード-idとそのエンティティのエンティティ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> 

それはあなたのエンティティIDと現在の俳優の破片-IDを抽出したい場合は、あなたが俳優の道から直接行うことができ、ということを意味します

var entityId = Self.Path.Name; 
var shardId = Self.Path.Parent.Name; 
関連する問題