6

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

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

4

2 回答 2

6

如果可能的话,要对代码进行热插拔是很棘手的。这也取决于变更集和正在运行的应用程序。

问题:

  • 旧的变量可能会乱扔命名空间并导致微妙的冲突、错误
  • 多个变量的重新定义不是原子的

如果您重新启动应用程序,命名空间中可能会有旧的变量不存在,但是如果您只是重新定义一些功能并保持应用程序运行而不重新启动,则会产生干扰。

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

一般来说,你最好

  1. 让代理保留请求,直到您的应用重新启动
  2. 启动与“旧版本”并行的新应用程序实例,并在新版本准备好处理请求后使用代理从新版本切换
于 2012-11-12T13:47:30.483 回答
4

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

于 2012-11-12T15:08:05.010 回答