使用热交换代码的clojure的Web应用程序

时间:2012-07-26 12:45:23

标签: clojure

我正在考虑在clojure中编写一个可以在不重新启动或失去状态的情况下自行更新的Web应用程序。

我见过一些文章,其中Clojure应用程序可以执行所谓的热交换代码。这意味着他们可以在运行时更新自己的函数。这可以安全地在网络服务器上执行吗?

2 个答案:

答案 0 :(得分:6)

如果可能的话,要获得代码的热插拔是很难的。 它还取决于变更集和正在运行的应用程序。

的问题:

  • 旧的vars可能会丢弃命名空间并导致细微的冲突,错误
  • 重新定义多个变量并非原子

如果重新启动应用程序,命名空间中可能会出现旧的变量,但如果您只是重新定义某些函数并保持应用程序在不重新启动的情况下运行,则会产生干扰。

另一个问题是原子性:重新定义多个函数,即更改多个变量不是原子的。如果在一个或多个命名空间中更改某些其他命名空间中的代码所依赖的函数,则使用新代码重新加载命名空间不是原子的。

一般情况下,你最好还是

  1. 让代理保留请求,直到您的应用重新启动
  2. 启动与“旧版本”并行的新应用实例,并在新版本准备好处理请求后使用代理从新版本切换

答案 1 :(得分:4)

Erlang中的OTP应用程序支持此功能。基本上,它会启动新版本的应用程序,并开始向新版本的应用程序发送请求。它将使旧版本保持活动状态,直到它完成处理请求然后将其关闭为止。