私はあなたがShardRegionに新しい俳優を作成するときにアサインされているどのようにIDが理解していない誰かが素晴らしいことだ、より明確な例を持っている場合、私はこの例をAkka.NETのシャードのエンティティにEntityIDを割り当てるにはどうすればいいですか?
を探していました。
私はあなたがShardRegionに新しい俳優を作成するときにアサインされているどのようにIDが理解していない誰かが素晴らしいことだ、より明確な例を持っている場合、私はこの例をAkka.NETのシャードのエンティティにEntityIDを割り当てるにはどうすればいいですか?
を探していました。
シャードされたアクター(エンティティ)をターゲットとするすべてのメッセージは、エンティティの種類に関係するシャードリージョンを経由しなければなりません。シャード領域は、次のように初期化することができます。
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;