2017-07-25 11 views
0

私は現在、同じ俳優に到達する複数の方法がある現在構築中のシステムにかなりの場所があります。たとえば、あなたが永続的な車の俳優を持っている場合、あなたはVINまたは登録プレートを使用することができます。間接参照を使用して以前に保持されたAkkaアクタを見つける

アクターを再作成するときにアクター名/パーシスタンスIDとして使用する単一の「真の名前」が必要なので、これらの「ルックアップ/参照」自体がアクターのIDを維持したまま、参照。

これは正しい方法ですか?それは本当に俳優ではなく、ただプロキシである多くの俳優のようです。

答えて

0

回答を更新するように編集しました。

車のコレクションを含むレポジトリがあり、各車にはVINまたはREG番号(またはシリアル番号、またはシャーシ番号...車を一意に識別するもの)を持つことができます。

ID | VIN | REG 
car1 | ABC | 123 
car2 | DEF | 456 

は、我々はまた、車のための状態とロジックをカプセル化し、永続的 CarActorを持っています。

public class CarActor : PersistentReceiveActor 
{ 
    string _id; 
    public override string PersistenceId { get { return _id; } } 

    public CarActor(string id) 
    { 
     _id = id; 
    } 

    public static Props Props(string id) 
    { 
     return Akka.Actor.Props.Create(() => new CarActor(id)); 
    }  
} 

我々は俳優名/永続 IDとして使用するために、単一の「真の名」が必要と俳優を再作成する際に、これらの「検索/参照が」持続、そのキーにちなんで名付けられた 俳優、自分自身です俳優のIDのみ 参照してください。

これは正しい方法ですか?実際に俳優ではなく、プロキシだけである多くの俳優のようです。

簡素化するために、私たちは自動車が識別できるさまざまなID番号をカプセル化するメッセージを定義できます。このメッセージは、処理のためにActorシステムに渡すことができます。

public class CarCommand 
{ 
    public string Vin { get; private set; } 
    public string Reg { get; private set; } 
} 

Best practiceエンティティのドメインに責任があると、自身の俳優として各エンティティを表現することを選択上司やルータの俳優を持っていることです。この管理者はCarCommandメッセージを受信し、VINまたはREGによって車のIDを調べ、メッセージを処理する子アクタを検索/作成することができます。

public class CarSupervisor : ReceiveActor 
{ 
    //in reality this would be a repository e.g. a DB context... it would 
    //be even better if this was handled in another Actor that this Actor 
    //has access to 
    readonly IEnumerable<Cars> _cars; 

    public CarSupervisor(IEnumerable<Cars> cars) 
    { 
     _cars = cars; 
     Receive<CarCommand>(command => 
     { 
      //find a car by VIN or REG or other variable 
      var car = _cars.First(c => c.VIN == command.VIN); 
      //see if any child actors have been created for this car instance 
      var child = Context.Child(car.Id); 
      //if we don't have an incarnation yet, create one 
      if (Equals(child, ActorRefs.Nobody)) 
       child = Context.ActorOf(CarActor.Props(car.Id), car.Id)); 
      //tell the child to process the message 
      child.Forward(command); 
     }); 
    }  
} 
+0

答えていただきありがとうございますが、あなたがその質問を理解しているかどうかはわかりません。この俳優にとって自然な鍵はありません。私はVIN、登録簿などでそれを見つけようとしている可能性があります。あらゆる参照(VIN、登録プレート)のために別個の俳優を持つこと以外に、これらのいずれかによって車を見つける方法はありますか?また、メモリリストには実現できません。 – jameswilddev

+0

VINまたはRegは一意のキーではありませんか?例えば。 1つのVINは、私たちのレポジトリにIDを持つ1台の車にしか関連しません。 'IdSupplierActor'は、VINやRegなどを含むメッセージを受け取り、問題の車のIDを返します。あるいは、 'CarFinderActor'はメッセージを受け取り、' Actor'へのパスを返します。 –

+0

これは私の言いたいことです。 Akka Persistenceを使ってどのように実装されますか?すべてのVINまたは登録番号が付いている俳優を雇うことは現実的ではありません。ありがとう。 – jameswilddev

関連する問題