3

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

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

4

3 回答 3

3

监督者对他们的孩子进行同步启动,依次启动每个孩子,然后按照它们在 childspeclist 中出现的顺序开始下一个。所以你super_supervisor应该以正确的顺序开始它的孩子,首先config_supervisor,然后auth_supervisor,最后rest_supervisor让他们按照这个顺序。主管必须(成功地)启动其所有子项,然后才能被视为启动。因此,如果config_supervisor在初始化期间必须启动所有必要的进程作为它的子进程,那么super_supervisor在完成之前不会启动其他主管config_supervisor

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

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

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

于 2014-05-02T22:21:46.430 回答
0

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

于 2014-04-30T22:13:54.267 回答
0

你看rest_for_one重启策略了吗?在这种情况下似乎应该很方便,中间主管按定义的顺序启动 gen_servers,最后是叶主管,叶主管依次启动关键进程。

在此处输入图像描述

于 2014-04-30T19:05:11.227 回答