2017-07-25 181 views
0

我目前正在建立一個系統中有相當多的地方,其中有多種方法可以聯繫到同一個演員。例如,如果你有一個持久的汽車演員,你可以使用VIN或車牌。使用間接參考查找以前持續存在的Akka演員

由於我們在重新創建actor時需要一個「真實名稱」作爲actor名稱/持久性ID,因此這些「lookups/references」本身就是actors,它們以鍵名命名,只保留actor的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還是註冊唯一密鑰?例如。一個VIN只能與一輛車相關,後者在我們的倉庫中有一個ID。 'IdSupplierActor'可以接收包含VIN或Reg等的信息,並返回有問題車輛的ID。或者一個'CarFinderActor'接受這個消息並返回一個到Actor的路徑。 –

+0

這就是我的意思;那麼如何使用Akka Persistence來實現呢?擁有一個擁有每個VIN或註冊牌號的演員是不可行的。謝謝。 – jameswilddev