繁体   English   中英

Erlang主管与一个关键孩子

[英]Erlang supervisor with one critical child

我们正在重新组织应用程序监督树,以使其更加健壮地处理故障和重新启动。 但是,我们有一个场景,我们有一位父母监督员,可以启动四名儿童监督员。 我们遇到的问题是第一个儿童主管启动了几个孩子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)。

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

主管同时开始他们的孩子, 在按照他们在childspeclist中出现的顺序开始下一个之前轮流启动每个孩子。 所以你的super_supervisor应该以正确的顺序启动它的子super_supervisor ,首先是config_supervisor ,然后是auth_supervisor ,最后是rest_supervisor ,让它们按顺序启动。 主管必须(成功)在考虑启动之前启动其所有子项。 因此,如果config_supervisor具有必须在初始化期间作为其子进程启动的所有必要进程,则super_supervisor将不会启动其他主管,直到config_supervisor完成为止。

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

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

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

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

在此输入图像描述

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM