【问题标题】:In Elixir, are dependent applications supervised?在 Elixir 中,依赖应用程序是否受到监督?
【发布时间】:2017-10-29 03:13:07
【问题描述】:

到目前为止,我知道当我启动我的 Elixir 应用程序时,一堆依赖的应用程序也会启动。

这些依赖应用程序是否以某种方式在我的应用监督树中启动?

如果依赖的应用程序崩溃了怎么办?重启了吗?

【问题讨论】:

    标签: erlang elixir erlang-otp erlang-supervisor


    【解决方案1】:

    我猜 Elixir 像 Erlang 一样工作。

    • 在 Erlang 中,每个应用程序都有一个独立的监督树
    • 如果应用程序崩溃,这意味着最顶层的主管确实崩溃了,并且所有重新启动策略都失败了。 简单地增加一个新的监督层解决问题的可能性很小。
    • 可以使用application:ensure_all_started(Application[,StartType]) 启动所有依赖项,StartType 可以是
      • temporary :(默认值):如果 temporary 应用程序因任何原因停止,则不会发生任何事情
      • permanent :如果 permanent 应用程序因任何原因停止,所有其他应用程序都会终止
      • transient :所有其他应用程序终止是 transient 应用程序因任何原因停止,但 normal
    • 也可以为每个依赖项调用application:ensure_started(Application[,StartType])。请注意,在这两种情况下,StartType 仅控制一个应用程序终止对其他应用程序的影响,但没有应用重启策略。
    • 使用application:which_applications()可以知道哪些应用程序正在运行

    【讨论】:

    • 我相信当环境为prod时,mix默认启动所有应用程序为:permanent。这由:start_permanent 项目选项控制,默认为Mix.env == :prod。任何人都可以确认是这种情况吗?另外,如何通过mix来配置每个应用程序StartType
    【解决方案2】:

    在 Erlang VM 中,所有应用程序都作为子应用程序主应用程序启动。
    每个应用程序都有StartType,它可以是temporarytransientpermanent 之一。
    permanent 和在某些情况下 transient 应用程序崩溃将影响整个 Erlang VM(VM 将崩溃并创建 crash.dump 文件)。
    根据Elixir application module,你可以在start/2中设置你的依赖类型。

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2023-03-02
      • 2015-09-27
      • 2011-05-24
      • 2015-10-02
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2020-08-02
      相关资源
      最近更新 更多