Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 自动重新启动动态添加的主管子级_Erlang_Otp - Fatal编程技术网

Erlang 自动重新启动动态添加的主管子级

Erlang 自动重新启动动态添加的主管子级,erlang,otp,Erlang,Otp,根据Erlang/OTP手册,如果我使用supervisor:start\u child将一个子项添加到一个管理器,并且该管理器崩溃,该子项将不会自动重新启动 () 是否有一个简单的解决方法,或者我必须手动保存动态添加的子项,并自行管理重新启动?(我的主管在上面有一个主管,所以这是可能的,尽管不是很优雅。)您的主管和其他主管一样是流程,区别在于他们是系统流程(所有这些都是陷阱退出业务)。当它死亡时,它所持有的内部状态也随之消失——噗 这是件好事 主管死亡的恢复与工人死亡的恢复相同(毕竟,一名主管

根据Erlang/OTP手册,如果我使用
supervisor:start\u child
将一个子项添加到一个管理器,并且该管理器崩溃,该子项将不会自动重新启动

()


是否有一个简单的解决方法,或者我必须手动保存动态添加的子项,并自行管理重新启动?(我的主管在上面有一个主管,所以这是可能的,尽管不是很优雅。)

您的主管和其他主管一样是流程,区别在于他们是系统流程(所有这些都是
陷阱退出业务)。当它死亡时,它所持有的内部状态也随之消失——噗

这是件好事

主管死亡的恢复与工人死亡的恢复相同(毕竟,一名主管是另一名主管的工人)。您可能遇到的情况是,您的监督树的结构与您的需求不太一致。如果你需要工作在主管去世后继续存在,那么这些任务比你安排的任务更接近程序的崩溃核心——这意味着要么他们应该是链上更高层的孩子,要么(更有可能)你高估了他们对系统的重要性

我开始担心确保流程持续的最常见原因是我给了它太多的责任。每当我问自己的问题,比如“如果管理者崩溃,我怎么能确保一个孩子被一个主管重新启动”,我停下来几分钟仔细考虑为什么我问这个问题,这总是导致我发现一个建筑问题。(顺便说一句,修复它总是会让系统其他部分变得更加合理)

现实生活示例:

在业务服务器中,有一个最初只是“客户端连接”的流程模块。它发展为管理与客户端的网络连接、内部Erlang值和外部协议值之间的转换,以及表示客户端的存在(存在、审核活动、授权、聊天等)在系统内部。由于审计日志记录,我开始想和你一样的事情:如果sup死了,我怎么才能关闭客户接触过的东西,等等

然后发生了一件被忽略的明显恼人的事情:从多个设备同时登录成为一项要求。当同一个“客户端”有多个时,多设备登录很奇怪,等等(而不是一个客户端进程只使用多个连接进程)。将这些任务分为不同的过程(不仅仅是模块),极大地简化了工作,并使状态恢复结构更加明显和清晰

附录


OP问“那么为什么静态和动态的孩子在这方面有区别呢?”这是个好问题。为什么我们有静态的孩子定义,动态的监控命令,比如and和那些奇怪的监管者

关键在于你的使用案例。比如说,我有一个游戏服务器,它需要始终有一个可用的大厅,以便玩家可以登录、聊天、查看军械库网站、在论坛上张贴noob问题和反开发者的咆哮,并且通常会以其他方式浪费时间,而这些方式只与实际游戏相关。我们永远不希望在其中发生崩溃让他们一次全部倒下,但也许我们确实希望能够告诉不同的运行服务在网络上监听或停止接受按需连接。然而,实际的游戏领域存在于各自独立的监督树分支中——如果其中一个倒下了,我们不希望它带走其他所有东西,我们确信我不想失去整个集群

那么,我们将如何构建它呢?所有的基本服务都将直接写入主管树的子定义中——除非我们手动创建,否则没有动态性。每当我们启动系统时,它们都会弹出。因为我们可能有任意多个游戏领域,而领域定义在内部被构建为一个基本的子定义静态定义的监管树,每个领域级监管人都是管理所有领域的简单监管人的子公司(因此,如果监管人倒下了,那么噗!每个人都回到大厅,可能很恼火)。可以根据我们的命令、设置文件或db数据或这些组合启动领域

不过,延迟启动外部网络服务可能是一件好事。启动系统时,我们可能有一些重要的启动任务,而且侦听器可能必须在群集中的不同节点上启动。为了避免网络连接直接给系统带来压力,请给我们时间检查系统或运行测试,并有机会将系统设置为某些特定模式(基准测试、测试、锦标赛或其他)我们可能希望推迟外部网络服务的启动。也就是说,我们强迫系统等待我们发送的命令,然后它才能打开狂欢节的大门,让未洗的人群进入。我们可以通过外壳或网络(如
浪费青春:诱惑灵魂(节点、端口、证书)
)简单地调用该命令,但由此产生的结果是一系列的
supervisor:start\u child/2
调用,这些调用是动态的

那么,如果网络服务管理器死掉会发生什么呢?连接会发生故障!在我们告诉它们之前,它们不会再次出现(不仅是活动连接,还有侦听器——它们可能独立于活动连接而死掉,具体取决于主管崩溃的内容),因为系统就是这样设计的。但是,如果这是一个问题,我们可以做很多事情来缓解它。我们可以有一个流程,其任务是了解和监控la