2012-04-28 28 views
10

讓一個演員在失敗中再次嘗試一些東西的好方法是什麼,但是重試之間的時間間隔越來越長?比方說,我希望演員在15秒後再嘗試30秒,然後每分鐘進行有限次數的嘗試。Akka:如何安排延遲間隔增長的失敗重試?

這是我想出來的:

  • 演員的執行實際工作有一個可選的 RetryInfo參數,如果存在的話,包含 重試我們目前的數量的方法在失敗
  • ,演員將自身發送一個新的ScheduleRetryMessageretryCount + 1,則拋出一個RuntimeException
  • 另一個演員監督工人的演員,用new OneForOneStrategy(-1, Duration.Inf()返回Resume作爲其指令。演員沒有狀態,所以Resume應該是OK
  • 在收到ScheduleRetryMessage,演員將
    • 如果retryCount < MAX_RETRIES:用阿卡的調度安排所需的延遲
    • 其他後發送RetryMessage:終於放棄,發送消息給其他演員的錯誤報告

這是一個很好的解決方案,或是否有更好的方法?

回答

8

你可以有一個主管啓動工人演員。文檔中的提示是爲工作人員聲明一個大小爲1的路由器。主管將跟蹤重試次數,然後根據情況安排發送給工作人員的消息。

即使您將創建另一層演員,但由於您將監督功能保留在工作人員身上,因此對我來說這看起來更清潔。理想情況下,您可以讓這1名主管爲n名工作人員,但我認爲您必須使用生命週期監控才能從小孩演員中獲得失敗。在這種情況下,您可以保留一張[ActorRef,Int]的地圖來跟蹤所有受監督工作人員的重試次數。監管政策將恢復,但如果您達到最大重試次數,您可以將PoisonPill發送給違規的ActorRef。

+0

有趣的想法,我會嘗試。謝謝! – 2012-05-18 12:26:59

7

在這種情況下,我使用標準監督。 父母/監督角色定義時間窗口內的重試次數。 重試工作人員子只是在preRestart()中延遲重新計劃導致失敗的消息。

如果重試的孩子相當複雜,可以考慮互連一箇中間角色。 該演員只是升級監督。 在preRestart上,中間參與者計劃(延遲)重新啓動消息。 作爲中間角色保存其狀態,它可以簡單地重新啓動工人角色(延遲)。

正如你所看到的延遲部分可能在preRestart或工人的開始。