2014-04-30 42 views
3

我們正在重新組織我們的應用程序監督樹,使其更加穩健地處理故障並重新啓動。但是,我們有一個場景,我們有一位家長主管,負責啓動四名兒童監督員。我們遇到的問題是,第一個孩子監督員啓動了幾個孩子的gen_servers,必須在第二個孩子監督員啓動之前啓動並初始化,否則將失敗。Erlang監督員,一個重要的孩子

所以,我需要類似下面的啓動:

test_app.erl - > super_supervisor - > [config_supervisor,auth_supervisor,rest_supervisor]

我遇到問題的訣竅是,config_supervisor必須完成在啓動auth_supervisor或rest_supervisor之前的所有初始化。通過rest_for_one啓動策略,本質上,我得到了這種行爲,但只有通過允許auth_supervisor失敗,因爲所需的配置不存在。我希望在移動到auth_supervisor之前請求config_supervisor完成它的初始化(包括啓動幾個gen_servers)。

這似乎是一個以前會被征服的常見情景,但是,我很難「搜索」解決方案。有沒有人有建議或示例代碼可能存在來處理這種情況?

回答

3

監事做子女的同步啓動,開始在它們發生在childspeclist順序開始下一前各一轉。因此,您的super_supervisor應以正確的順序啓動其子項,首先按config_supervisor,然後auth_supervisor,最後按順序啓動子項。主管必須(成功)啓動其所有子女,然後才能開始工作。因此,如果config_supervisor具有必須在初始化期間作爲其子進程啓動的所有必需進程,那麼super_supervisor將不會啓動其他主管,直到完成config_supervisor

在這種情況下,您不需要rest_for_one以確保如果孩子在childspeclist中按正確的順序開始正確的順序。

對於工作進程gen_server/gen_fsm/gen_event,當它們的init回調返回時,它們被視爲啓動。

我理解了你的描述和問題嗎?

0

你看過rest_for_one重啓策略嗎?在這種情況下,它似乎應該是方便的,中間的主管以一個確定的順序啓動gen_servers,並讓葉主管依次啓動關鍵進程。

enter image description here

+0

這是錯誤的順序。如果任何'gen_server'實例死亡,'rest_for_one'會殺死關鍵進程。通常,關鍵流程應該靠近樹頂。 –

+0

好吧,當我讀到這個問題時,它就是我所理解的,除非4個gen_servers啓動,否則此進程無法運行。我的措辭「關鍵過程」似乎是不合適的 – Pascal

+0

謝謝@Pascal。這很接近,但我想我可能沒有正確描述這種情況。我會更新這個問題。 – RockyMountainHigh

0

您可以嘗試config_supervisor搬進自己的應用程序,設置應用作爲主要的一個要求,在這種情況下,配置應用程序將先啓動,然後主監裝auth_supervisor等將開始他們的初始化。