我目前正在建立一個系統中有相當多的地方,其中有多種方法可以聯繫到同一個演員。例如,如果你有一個持久的汽車演員,你可以使用VIN或車牌。使用間接參考查找以前持續存在的Akka演員
由於我們在重新創建actor時需要一個「真實名稱」作爲actor名稱/持久性ID,因此這些「lookups/references」本身就是actors,它們以鍵名命名,只保留actor的ID參考。
這似乎是正確的方法嗎?好像很多演員不是真正的演員,只是代理人。
我目前正在建立一個系統中有相當多的地方,其中有多種方法可以聯繫到同一個演員。例如,如果你有一個持久的汽車演員,你可以使用VIN或車牌。使用間接參考查找以前持續存在的Akka演員
由於我們在重新創建actor時需要一個「真實名稱」作爲actor名稱/持久性ID,因此這些「lookups/references」本身就是actors,它們以鍵名命名,只保留actor的ID參考。
這似乎是正確的方法嗎?好像很多演員不是真正的演員,只是代理人。
編輯更新答案。
聽起來我們有一個存儲庫,其中包含一系列汽車,每輛汽車都可以有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);
});
}
}
感謝您的回答,但我不確定您是否理解了這個問題。這位演員沒有天然的關鍵。我可以嘗試通過VIN,註冊牌等來找到它。除了每個參考(VIN,註冊牌)都有獨立的演員以外,是否有任何方法可以找到汽車?另外,在內存列表中將不可行。 – jameswilddev
不是VIN還是註冊唯一密鑰?例如。一個VIN只能與一輛車相關,後者在我們的倉庫中有一個ID。 'IdSupplierActor'可以接收包含VIN或Reg等的信息,並返回有問題車輛的ID。或者一個'CarFinderActor'接受這個消息並返回一個到Actor的路徑。 –
這就是我的意思;那麼如何使用Akka Persistence來實現呢?擁有一個擁有每個VIN或註冊牌號的演員是不可行的。謝謝。 – jameswilddev