2016-09-30 66 views
0

我開始用Akka創建一個系統。該系統必須解決產品的依賴關係。依賴關係從兩個不同的來源計算。Akka,給定請求的合計回覆

class Deps extends Actor { 
    def receive = { 
    case Resolve(p) => 
    context.actorOf(System1.props) ! Resolve(p) 
    context.actorOf(System2.props) ! Resolve(p) 
    } 
} 

但它必須彙總兩個回答才能回覆自己。沒有Akka的任何經驗,我想到了兩種解決方案。

1 /維護一個Map[(Product, Sender), Set[Response]]

每次Deps演員從一個孩子接受Response,將其添加到組的響應,如果有兩個響應它可以創建併發送響應。

2 /創建一個ActorProduct

Deps演員是(或創建一個兒童演員即是)與Product作爲構造參數初始化。它維護兩個var Option[Response],每次收到一個Response他驗證他們是否都在場,他可以創建併發送響應。

我認爲這是最好的方法,但我必須維護兩個var的響應和一個發件人,所以我不知道這是最好的方法。

3 /用途ask

一切被描述成該文檔。

4 /使用告訴了可變「結果」

我實際的代碼已經一個Report這是來自所有來源的結果更新。但我可以使用與噴霧相同的圖案;我可以將報告作爲消息的一部分傳遞給所有參與者,以便他們可以立即更新消息,以便我可以真正「開火併忘記」。

在回覆演員的發件人之前,等待和聚合多個響應的常用方法是什麼?

回答

0

你可以在「聚集多個響應」通過使用Future,我認爲有一個換理解最好理解的flatMap功能:

val fut1 : Future[Response] = 
    (context.actorOf(System1.props) ? Resolve(p)).mapTo[Response] 

val fut2 : Future[Response] = 
    (context.actorOf(System2.props) ? Resolve(p)).mapTo[Response] 

val comboFut : Future[(Response, Response)] = 
    for { 
    resp1 <- fut1 
    resp2 <- fut2 
    } yield (resp1, resp2) 

這個未來然後可以與pipe pattern使用:

import akka.pattern.pipe 

comboFut pipeTo sender 
+0

謝謝。但是在這裏你使用的是「問」模式。雖然看起來「告訴」是首選。 –

+0

一致認爲,由於性能的原因,首選是告訴,但它會使你的演員中的邏輯更加複雜。詢問你可以使用理解來彙總答案;告訴你必須在多個接收調用之間保持狀態。 –