【发布时间】:2011-07-26 00:54:21
【问题描述】:
我有一个 one_for_one 主管,负责处理相似且完全独立的孩子。
当一个孩子出现问题时,反复崩溃触发:
=SUPERVISOR REPORT==== 30-Mar-2011::13:10:42 ===
Supervisor: {local,gateway_sup}
Context: shutdown
Reason: reached_max_restart_intensity
Offender: [{pid,<0.76.0>}, ...
自行关闭并终止所有无辜的孩子,否则这些孩子会继续正常运行。
如何从标准 Erlang 监督者构建监督树,只停止重新启动一个有问题的孩子而让其他孩子独自一人?
我正在考虑增加一个只带一个孩子的主管,但这对我来说似乎很重要。
还有其他方法可以处理吗?
【问题讨论】:
-
额外的主管只会把问题推得更深。它仍然会崩溃,然后崩溃顶级主管。在这种情况下,只需增加最大重启次数和最大时间值...
-
@Adam:我需要停止重新启动孩子,因为它似乎阻止了我与主管交谈。所以我真的希望它停止重新启动有问题的孩子,但不终止其余的孩子。我希望无需编写自己的主管就可以实现这一点。
-
如果我错了,请纠正我,但我将您的场景总结为:您有一个具有完全独立孩子的主管,孩子可以在启动时超时或在运行时崩溃,您想重新启动每个孩子在不影响其他孩子的情况下停止重新启动行为不端的孩子?
-
感觉你搞错了。 Adam 的解决方案巧妙地解决了问题,但感觉您需要看看为什么会崩溃,而不是崩溃并等待人工干预。如果您的主管因为忙于尝试重新启动立即崩溃的东西而被锁定,那么您就崩溃了。 (是的,存在崩溃错误之类的事情;)我建议您查看您的恢复策略,即您如何从崩溃中重新启动以及哪些错误数据可能会将其锁定在一个紧密的循环中。
-
@Mazen:你的感觉是对的:我错了,我要改变它。 但是我利用这个机会使整个监督的东西更加健壮,以防止“错误崩溃”。麻烦的是,虽然我可以改进常见情况,但我开始使用的代码具有相当复杂的启动,即使一个孩子的行为出乎意料地非常讨厌(无故终止孩子会产生大量金钱),其他孩子继续运行是非常重要的在这里给客户造成损失,甚至可能发生硬件损坏)
标签: erlang erlang-otp erlang-supervisor