杀死Phoenix框架中的Supervised进程会导致整个应用程序关闭

问题描述 投票:0回答:1

我有一个 Phoenix 应用程序,它创建以下监督树(取自 erlang 观察者):

supervisor的重启策略是:one_to_one。期望的是,如果我终止任何受监督进程,该单个进程将由主管立即重新启动。这是遥测过程中唯一的情况。如果任何突出显示的进程被终止(使用 iEX 中的观察者或 Process.exit),则会发生以下情况:

这是之后更新的应用程序树,似乎整个 Phoenix 应用程序崩溃了。所有API请求都找不到服务器:




关于为什么会出现这种情况有什么想法吗?我怎样才能实现预期的行为?

crash elixir phoenix-framework fault-tolerance erlang-supervisor
1个回答
0
投票

这更多的是在主管上使用

Process.exit(pid, :kill)
的问题。
:kill
是最后的手段信号,它会导致主管“立即终止”,而不通知其子级正确终止。所以主管退出,孩子们现在必须注意到他们的父母已经死了,清理并终止。 同时,应用程序同时重新启动树的一部分,这最终与仍在关闭的旧树发生冲突,导致另一次失败。这最终会触发 max_restarts 并关闭应用程序。

整体:

当进程没有响应任何其他退出信号时,仅使用

:kill
    作为最后的手段。这尤其适用于主管,因为他们唯一的工作是确保流程相应地启动和终止,并且发送
  1. :kill

    会导致

    
    
    如果你想模拟停止主管,

    Supervisor.stop
  2. 至少会经历通常的流程
  3. 运行

    iex --logger-sasl-reports true -S mix phx.server
  4. 以获取所有内容的精确日志记录(这是我用来调试的)
  5.     

© www.soinside.com 2019 - 2024. All rights reserved.