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

Rob*_*sen 6 clojure

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

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

lac*_*oka 6

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

问题:

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

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

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

一般来说,你也会更好

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