2016-07-26 96 views
0

我想創建基於Akka的分佈式電子郵箱系統。當我的應用程序啓動時,我想創建所有收件箱的演員,並啓動調度程序,以10秒爲間隔接收郵件。 但是,如何創建這些收件箱演員存在問題?是否有可能在集羣上創建actor或在其存在時獲取對它的引用?角色名稱可以是數據庫中的郵箱UUID,並且羣集中只能存在一個具有特定UUID的角色。分佈式電子郵箱的Akka演員系統設計

最重要的問題是如何使用uuid作爲cluster中的名稱創建actor,或者如果它存在,請參考它?我嘗試此配置:

actor { 
    provider = "akka.cluster.ClusterActorRefProvider" 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    log-remote-lifecycle-events = on 
    netty.tcp { 
     hostname = "127.0.0.1" 
     port = 2552 
    } 
    } 

    cluster { 
    seed-nodes = [ 
     "akka.tcp://[email protected]:2552"] 
} 

而這個代碼來創建演員或得到參考吧

def createActorIfNotExists(actorSystem: ActorSystem, name: String, props: Props) 
          (implicit ec: ExecutionContext): Unit = { 
    implicit val timeout = Timeout(5 seconds) 

    actorSystem.actorSelection(name).resolveOne() onComplete { 
     case Success(actor) => 
     Logger.debug(s"Actor already created $name") 
     case Failure(ex) => 
     Logger.debug(s"Creating actor $name") 
     val actor = actorSystem.actorOf(props, name) 
    } 
    } 

但上面的代碼創建,而不是在集羣上的本地演員系統參與者(下一個節點創建自己的演員,而不是選擇現有)。

對於發件箱,我也想到調度員演員。分派器將成爲羣集單身人士並將消息發送給正確的演員子女。但它可能是瓶頸?

爲單身演員Path可以例如/用戶/郵箱,併爲特定的發件箱/用戶/郵箱/ UUID

回答

1

聽起來像是你想要做什麼比賽阿卡集羣拆分非常好聽。

它允許您使用id來處理參與者,並負責平衡羣集中的參與者。

您可以在這裏的文檔閱讀更多關於它: http://doc.akka.io/docs/akka/2.4/scala/cluster-sharding.html#cluster-sharding-scala

+0

謝謝,這是我需要的。你能告訴我是否有可能在系統啓動時啓動所有實體,併爲他們安排任務以便perdiodicaly下載郵件? – user2860204

+0

您不知何故必須在啓動時獲得所有ids的完整集合,可以使用actor系統調度程序來安排定期下載。儘管如此,您需要仔細考慮解決方案的縮放比例與預期的男性盒子數量之間的關係。 – johanandren