尽力而为的OTP监督

时间:2017-08-23 02:15:24

标签: erlang elixir otp supervisor

我想做的是改变我的主管,尽最大努力让孩子继续跑步,但如果他们的碰撞率超过强度,就放弃。这样,其余的孩子继续跑步。但是,对于现有的管理程序配置,这似乎是不可能的,所以看起来我唯一的选择可能是实现我自己的主管,这样我就可以在收到EXIT时使其表现得这样。

有没有办法在不编写自己的主管的情况下实现这样的自定义OTP管理程序行为?

3 个答案:

答案 0 :(得分:5)

听起来像你想要的是每个孩子的个人主管,正如你所说的那样负责让它保持活力,并且作为一个上面有一个主管(一对一或一对一)简单的一对一)孩子被标记为临时的,所以当其中一个人放弃时,其余的孩子都会继续跑步。

答案 1 :(得分:4)

您不能“扩展”Supervisor来添加不同的监督行为,但您也不必从头开始。 :supervisor模块本身是在:gen_server之上实现的,所以如果您确实需要某些内容,我会参考:supervisor的源代码(您可以找到here)一种定制的监督行为;它会给你一个建立基础,以避免你可能遇到的一些陷阱。

一旦我对您的用例有了更好的了解,我就可以扩展我对替代解决方案的回答。正如我在评论中提到的那样,听起来你可能会在init/1过程中做一些容易失败的事情。 init/1不是处理这些事情的地方,因为如果暂时无法成功执行该操作,您几乎肯定会打击主管的最大重启强度。

例如,假设您有一个与数据库通信的进程,并且需要数据库连接;您不希望在init/1期间尝试连接到数据库。相反,你应该获得post-init之后的连接(可能是首次使用,或者通过使用Process.send_after(self(), :connect, 0)立即向进程发送post-init消息),如果连接失败,则返回类似{:error, :database_unavailable}的内容尝试重新建立连接时对任何呼叫者。使用这种方法进行设计将使您的监督树保持稳定,而是将如何处理故障的决定推送给可能有更好信息影响它们的客户(即,如果他们重试操作,则返回他们的调用者出错,退出异常,等等。)

答案 2 :(得分:1)

您也可以使用director,它可以更灵活地解决此问题。