【问题标题】:JVM: Is it possible hotfix/patch production code via remote Clojure repl?JVM:是否可以通过远程 Clojure repl 进行修补程序/补丁生产代码?
【发布时间】:2020-04-03 12:30:31
【问题描述】:

Clojure for Java Programmers Part 1talk 中,Rich Hickey 提到这是 Clojure 的优势之一:

如果您构建的应用程序具有加载能力 代码 - 远程 repl 连接或某种方式来做到这一点。您的 正在运行的生产系统将具有修复的能力 加载到正在运行的程序中。

我想知道它在实践中有多容易。假设我知道一个函数中有一个错误,我想通过远程 repl 在生产中重新定义/覆盖它

  • 有可能吗?
  • 在我退出 repl 后,覆盖的版本会保持活动状态吗?
  • 在所有 JVM 应用程序容器中都有这种行为吗?

我没有任何在生产中使用 JVM 的经验,这就是问这个问题的原因。

【问题讨论】:

    标签: clojure jvm read-eval-print-loop


    【解决方案1】:

    有可能吗?

    是的,我建议观看 The Joys and Perils of Interactive Development - Stuart Sierra 他讲述 NASA 使用 REPL 在太空中对卫星进行热修复的故事。

    在我退出 repl 后,覆盖的版本会保持活动状态吗?

    当您重新评估函数时,更改将应用​​到任何地方,例如

    (defn add1 [x]
      (+ x 2))
    
    (defn foo [x]
      (add1 x))
    
    (foo 1)
    

    通知(foo 1) => 3,如果您修复并重新评估add1,然后再次运行(foo 1) => 2

    【讨论】:

    • 我们在工作中偶尔会这样做——通过连接的 REPL 将修补程序应用于生产——但这当然是有风险的,因为您正在修改人们(可能)积极使用的正在运行的应用程序.值得注意的是,虽然通过 REPL 应用的更改在您与进程断开连接后仍然存在,但更改仅在内存中应用,如果您重新启动进程,它将丢失这些更改(因为它将以任何版本启动代码在磁盘上)。
    猜你喜欢
    • 2011-07-26
    • 1970-01-01
    • 2022-01-17
    • 2010-09-27
    • 2011-03-25
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多