Erlang的主管与一个关键的孩子

我们正在重新组织我们的应用程序监督树,使其更有力地处理失败并重新启动。 但是,我们有一个场景,我们有一位家长主管,负责启动四名儿童监督员。 我们遇到的问题是,第一个孩子监督员启动了几个孩子的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)。

这似乎是一个以前会被征服的常见场景,但是,我正在很难“搜索”解决方案。 有没有人有建议或示例代码可能存在来处理这种情况?


主管做同步启动他们的孩子,依次开始每个孩子,然后开始下一个孩子的发生顺序 。 所以你的super_supervisor应该按照正确的顺序启动它的子项,首先是config_supervisor ,然后是auth_supervisor ,最后是rest_supervisor 。 主管必须(成功)启动其所有子女,然后才能开始工作。 因此,如果config_supervisor具有必须在初始化期间作为其子进程启动的所有必需进程,那么在config_supervisor完成之前, super_supervisor将不会启动其他supervisor。

在这种情况下,如果孩子在rest_for_one中按正确顺序排列,则不需要rest_for_one来确保以正确的顺序开始。

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

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


您可以尝试将config_supervisor移动到其自己的应用程序中,并将该应用程序设置为主应用程序的一个需求,在这种情况下,配置应用程序将首先启动,然后具有auth_supervisor的主管理器等将开始其初始化。


你看过rest_for_one重启策略吗? 在这种情况下,它似乎应该是方便的,中间的主管以一个确定的顺序启动gen_servers,并让叶主管依次启动关键进程。

在这里输入图像描述

链接地址: http://www.djcxy.com/p/38213.html

上一篇: Erlang supervisor with one critical child

下一篇: Erlang supervisor termination behavior