2014-07-21 64 views
3

我有接收到消息而在ReadyState等待在多個阿卡FSM消息

lookupA ! Wrapper(Lookup("A")) 
lookupB ! Wrapper(Lookup("B")) 
lookupC ! Wrapper(Lookup("C")) 
goto(LookingUpDataState) using DataFound(a = None, b = None, c = None) 

演員然後等待響應之後運行下面的僞代碼的阿卡FSM演員其可以是FullResult[T](延伸ServiceResult[T])或Empty(延伸ServiceResult[Nothing])。成功的查找結果用於填充DataFound實例的字段,Empty查找結果會導致記錄的錯誤消息和actor的終止。

我的問題是:我怎樣才能確定哪些查找失敗,以便我可以記錄失敗或回退到默認值?我能想到的只是檢查發件人的ActorRef(hacky)或向所有郵件添加唯一的ID字段(開銷過高)。

這是使用Ask和期貨解決的一個簡單問題。是否存在慣用的Akka解決方案?

回答

5

你可以在這裏使用幾種模式。您將不得不訴諸下列選項之一。他們都有一些折衷(和基準爲王無論如何),但我已經在「壞到好」的順序列出它們,

  • 進行有序的查詢,因此發送,等待響應,發送B ...但這是可怕的 - 在不必要的順序。
  • 使用ask模式,所以你會旋轉起來(在內部這是如何工作)3名演員,他們將完成「他們自己」的未來。所以這對發送者也有一定的成本,因爲它必須啓動這些特殊目的演員(比普通演員小,但仍然)。
  • 是的,你需要以某種方式標記這些消息。所以你會發送一些ID並且迴應必須包含相同的ID,那麼你知道它是「哦,這是對A的迴應」等等。我認爲這是推薦的方式。
  • 有一個貢獻在Akka中可用的模式稱爲聚合器,它是專門爲此用例設計的,因此您可能想要查看它:http://doc.akka.io/docs/akka/2.3.4/contrib/aggregator.html但是,如果您喜歡它,則非常關乎個人品味。猜測。

我個人最喜歡的(我們傾向於避免一般ask)將被標記,以便響應,也可以裹在這樣Envelope(id, response)Envelope(id, payload)請求。如果您決定將這些簡單的信封或更多的域名術語稱爲您,

希望這會有所幫助。