[英]Actor lookup in an Akka Cluster
我有一個Scala應用程序,我有幾個節點。 每個節點都有一個帶有主actor的ActorSystem,每個actor必須有一些ActorRef給某些actor(例如“Node 1”有“Actor3”,“Actor3”需要ActorRef為“Actor7”和“Actor8”才能完成它的工作) 。 我的問題是我不知道另一個節點(“Node2”)是否有我正在尋找的“Actor1”或“Actor7”。
我的想法是在每個MemberUp中循環,使用ActorSelection幾次並詢問每個新成員是否有我正在尋找的actor。 這是我能做到的唯一方法嗎? 有沒有辦法更有效地做到這一點?
ActorSelection
的另一種方法可以是查找表。 如果你需要做很多演員選擇而且演員創作不是那么動態,那么它可以是更好的解決方案。
在每個節點上,您可以創建一個數據結構,如Map[String,List[String]]
第一個鍵是節點名稱,List值是此節點中的actor refs。
特技是當任何節點為其actor(創建,停止)更改時,另一個actor應該注意到其他節點有關更改,因此任何節點都已同步更新的地圖。
如果你保證它,那么每個節點都可以查找actor的存在;
map.get(nodeName) match {
case Some(n) => n.contains(actorName)
case None => false
}
通過在每個節點上的已知路徑上安裝DiscoveryActor
,我已經在我們的集群中解決了一個非常類似的問題。 DiscoveryActor的協議有
Register(name, actorRef)
Subscribe(name)
Up(name, actorRef)
Down(name, actorRef)
每個命名的 actor都向其本地DiscoveryActor
發送一個Register
,后者又將Up
向所有本地用戶和其他節點上的所有其他DiscoveryActor
廣播,然后向其訂戶廣播
DiscoveryActor
MemberUp
/ MemberDown
以確定何時查找新的對等DiscoveryActor
並廣播其本地注冊或廣播Down
以查看已關閉的對等方的注冊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.