Elixir应用程序中不止一名主管

时间:2019-02-22 13:26:12

标签: elixir phoenix-framework

我想在我的Phoenix申请中注册2个根主管,是否有任何理由不这样做?

示例如下

defmodule MyApp.Application do
  use Application
  import Supervisor.Spec

  def start(_type, _args) do
    children_sv1 = [
      supervisor(MyApp.Repo, []),
      ... # other workers
    ]

    children_sv2 = [
      supervisor(MyApp.Endpoint, []),
      ... # other workers
    ]

    opts1 = [strategy: :one_for_one, name: MyApp.Supervisor1]
    opts2 = [strategy: :one_for_one, name: MyApp.Supervisor2]

    Supervisor.start_link(children_sv1, opts)
    Supervisor.start_link(children_sv2, opts)
  end
end

1 个答案:

答案 0 :(得分:2)

不执行此操作的一个原因是,您的特定应用程序本身已作为OTP范围的监视树的一部分受到监视。 start的返回值由顶级应用程序管理程序用来监视您的特定应用程序。

如果您将结果明确分配给上述主管电话,则会看到您正在删除信息:

{:ok, sup1_pid} = Supervisor.start_link(children_sv1, opts)
{:ok, sup2_pid} = Supervisor.start_link(children_sv2, opts)
{:ok, sup2_pid}

这意味着尽管第一个主管将链接到启动您的应用程序的任何过程(例如顶级应用程序主管),但它不会出现在查看监管树的函数的输出中,例如{{1} }。在正常操作期间,这没什么大不了的,但是如果出现任何问题,您自己可能很难剖析问题,而依赖于适当监督层次结构的OTP工具在这种设置下的行为可能会很奇怪。正常停止应用程序可能会或可能不会出现问题。

将整个监管树指定为适当的树总是比较安全的选择-您最终将获得更加可预测的应用程序。如果您需要对树的哪些分支独立以及如何重新启动它们进行精细控制,则子规范是您最好的朋友。