2011-11-23 142 views
1

我有一個節點可能正在運行多個服務器實例(Akka remote actor)。我希望客戶能夠掃描給定節點上的一系列端口以查找實時服務器。掃描Akka Actor

我寫在我的客戶演員這個方法:

private def scanHost(serverHost: String) = { 
    val initialPort = 36627 
    val portsToScan = (initialPort until initialPort + 32).toList 
    val tries = portsToScan map { 
     port ⇒ remote.actorFor("EnMAS-service", serverHost, port) ? Discovery 
    } 
    val replies = tries filter { future ⇒ { 
     try { 
     future.get match { 
      case reply: DiscoveryReply ⇒ true 
      case _ ⇒ false 
     } 
     } 
     catch { case _ ⇒ false } 
    }} 
    ClientManager.ScanResult(replies map {_.get.asInstanceOf[DiscoveryReply]}) 
    } 

我想知道,有沒有得到這個工作更習慣的方法?雖然我想這個用例相當普遍,但我無法在這方面找到太多內容。

回答

3

聽起來就像你在羣集之後。在Akka 2.1發佈(內置羣集支持)之前,您可以使用類似ZooKeeperJGroups或其他方式在節點註冊時註銷它們,當它們離開(或超時)時註銷

+0

是的,基本上我正在設置羣集每個「集羣」都有一個任意的頭節點來同步它的同伴。我希望留在Scala標準庫和Akka框架內,以避免引入另一個依賴。我應該由Akka現在的主管負責,但我期待着即將到來的集羣支持。謝謝(你的)信息。 –

+0

那麼,你可以通過建立一個你所撥入的聚合節點來跟蹤客戶端。然而,分佈式錯誤檢測遠非微不足道,這就是爲什麼我們將集羣作爲2.1的主要特性發布的原因 –