Erlang主管与一个关键孩子

时间:2014-04-30 17:13:44

标签: functional-programming erlang otp supervisor

我们正在重新组织我们的应用程序监督树,以使其更有力地处理故障和重新启动。但是,我们有一个场景,我们有一位父母监督员,可以启动四名儿童监督员。我们遇到的问题是,第一个儿童主管启动了几个孩子gen_servers,必须在第二个儿童主管开始之前启动和初始化,否则它将失败。

所以,我需要一个像以下一样的创业公司:

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 个答案:

答案 0 :(得分:3)

主管同步开始他们的孩子,在按照他们在childspeclist 中发生的顺序开始下一个 之前依次开始每个孩子。因此,super_supervisor应按照正确的顺序启动子项,首先config_supervisor,然后auth_supervisor,最后rest_supervisor按顺序启动子项。主管必须(成功)在考虑启动之前启动其所有子项。因此,如果config_supervisor具有必须在初始化期间作为其子项启动的所有必要进程,则super_supervisor将在config_supervisor完成之前不启动其他主管。

在这种情况下,如果子项列表中的子项顺序正确,则不需要rest_for_one来确保以正确的顺序启动。

对于工作进程gen_server / gen_fsm / gen_event,当它们的init回调返回时,它们被视为已启动。

我是否正确理解了您的描述和问题?

答案 1 :(得分:0)

您是否看过rest_for_one重启策略?在这种情况下,它似乎应该是方便的,中间主管以定义的顺序启动gen_servers并持续启动关键过程的叶子主管。

enter image description here

答案 2 :(得分:0)

您可以尝试将config_supervisor移动到自己的应用程序中,并将应用程序设置为主应用程序的要求,在这种情况下,首先启动配置应用程序,然后使用auth_supervisor等主管理器开始初始化。 / p>