【问题标题】:Erlang Hot Code Swapping vs interpreted languagesErlang 热代码交换与解释语言
【发布时间】:2016-08-13 18:25:43
【问题描述】:

广泛宣传的有关 Erlang 的功能是它能够在应用程序运行时热交换代码模块,并显示为其他语言中没有的独特杀手级功能。

这是来自Joe Armstrong's book的引用:

大多数服务器执行固定程序,并且 如果要修改服务器的行为,则必须停止服务器 然后用修改后的代码重新启动它。

尽管如此,在 Web 开发环境中,大多数语言都支持所谓的代码热交换,即使没有这样称呼它。它只是更新代码并通过 git 或持续集成解决方案将其发布到网络上。

我知道 Erlang 在 web 以外的领域有很多应用程序,所以我相信在这些情况下它是有意义的。

但是,与用于 Web 的动态语言(如 Python、Ruby、JavaScript)相比,此功能是否有优势? Web 开发在哪些情况下优于流行的面向 Web 的语言?

【问题讨论】:

    标签: erlang hotswap


    【解决方案1】:

    erlang 中的热代码交换提供的不仅仅是升级代码的能力(我不会与 python、ruby 或 javascript 进行任何比较,我对它们的了解非常有限)

    • 您可以为每个节点决定何时加载新版本的代码
    • 然后 VM 中将存在 2 个版本的代码,所有正在运行的进程将使用每个模块的旧版本,直到发生对该模块的下一次完全限定调用 (Mod:Func/arity)
    • 如果您使用 OTP 行为,服务器(或 fsm 或 gen_event)将首先调用其 code_change 回调,接收参数,旧版本的模块。因此,在真正跳入新代码之前,可以检查是否可以管理升级,并对状态数据、ETS、进程同步执行任何必要的操作。
    • 如果您不使用 OTP 行为,仍然可以接收 {system, From, Req} 形式的消息,然后调用 sys:handle_system_msg/6,然后调用 code_change 回调。

    【讨论】:

      【解决方案2】:

      此功能并非针对 Web 开发,就像 Erlang 本身并不是专门为 Web 开发而创建的一样。

      此功能优于用于网络的一般动态语言中使用的模型的一个可能领域是对代码升级方式的精确控制。

      • 代码不仅可以在调用之间更新,也可以在调用期间更新
      • 您可以为调用相关的状态提供明确的升级路径

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 2011-01-07
        • 2011-05-23
        • 2018-08-09
        相关资源
        最近更新 更多