2012-10-09 49 views
3

我剛剛開始與阿卡,我試圖分裂一些凌亂的功能在更易於管理的部分,每個將由不同的演員進行。Stateless Akka actors

我的任務似乎恰恰適合演員模型。我有一個對象樹,它們保存在數據庫中。每個節點都有一些屬性;讓'專注於一個,並稱之爲財富。孩子的財富取決於父母的財富。當一個人計算節點上的財富時,這應該引發對孩子的類似計算。我想收集所有更新的節點實例並將它們同時保存在數據庫中。

這似乎很簡單:一個actor只執行計算,然後爲當前節點的每個子節點啓動另一個actor。當所有的孩子回覆一條帶有計算結果的消息時,這個角色收集他們,添加當前節點並向他之上的演員發送消息。

問題是,我不知道一種方法來確保一個人收到所有孩子的消息。一個簡單的方法就是使用一個計數器,並且每當來自孩子的消息到達時增加計數器。

但是如果系統的兩個獨立部分需要執行這樣的計算並重復使用同一個actor,會發生什麼情況?演員會產生兩倍的孩子,並且計數將不再可靠。我需要的是確保同一個actor不會從外部系統重用,但是每次觸發計算時都會生成新的actor。

這甚至可能嗎?如果不是,阿卡有沒有一種自動機制來確保每個孩子都完成了自己的任務?

我只是在這裏不適合使用演員模型嗎?基本上,我所做的只不過是可以用函數完成的 - 演員本身是無狀態的,但它們允許我簡化並行計算。

+0

想要同時保存所有更新節點的原因是什麼? – Larsenal

+0

另外,樹的近似大小是多少?關於多少個節點?通常有多深? – Larsenal

+0

@Larsenal爲了保持一致性,我必須將所有節點保存在單個事務中。當然,我可以打開一個事務,開始保存節點,然後關閉它。但我更喜歡讓所有內容都具有透明度,並在最後進行一次保存操作 - 除此之外,它更容易測試。關於樹的大小,它不會很深,通常只有3層。但它可能相當大。在這個發展階段提供硬數據爲時尚早,但我預計在第二階段將會有數百或數千個節點,每個節點只有少數幾個孩子。 – Andrea

回答

3

您描述事物的方式,我認爲您真正想要的是一個返回Future [Tree [NodeWealth]]的遞歸函數,函數每次調用Future時都會生成一個Future,並且它會爲每個函數調用它自己孩子在層次結構中,在功能結束時,它將這些呼叫的期貨組合成單一的未來[結果]。當遞歸函數終止並返回Future [Tree [NodeWealth]]時,您可以使用另一個Future更新您的數據庫。看看Akka文檔here on Futures。並特別注意「撰寫期貨」部分。

期貨的組成應該允許您避免狀態並輕鬆實現。

另一種選擇是使用演員和期貨,並在兒童演員身上使用問答模式,將所產生的未來組合成一個單一的未來,然後返回給發件人(父演員)。這本質上是一樣的,只是與演員交織在一起。如果因爲其他原因已經將節點表示爲演員,我可能只會走這條路線。

+0

我也在考慮未來,但我確實不確定我以後會不會需要更多的演員特色。我認爲我現在將以簡單的未來走向,並在需要出現時混合期貨和演員。 – Andrea