使用Clojure实现热代码替换的Web应用程序

6
我在考虑用Clojure编写一个Web应用程序,它可以在不重启或丢失状态的情况下更新自己。
我看过一些文章,Clojure应用程序可以进行所谓的代码热交换。这意味着它们可以在运行时更新自己的函数。在Web服务器上执行这个操作是否安全?

2
请在你的最后一句中定义“safe”。 - Dimagog
Meteor一样的方式。那将是很好的。 - Marek Sybilak
@dimagog 在不崩溃服务器、不让用户重新连接以及不丢失或损坏状态的情况下进行更新,我知道如果更新第三方库或实际的TCP(或http)处理方式发生变化,这是不可能的。然而,大多数情况下,您会对实际应用程序进行更改,因此修复错误而无需重新启动服务器将是非常好的。 - Robin Heggelund Hansen
1
要实现代码的热插拔并不容易,如果可能的话。 - laczoka
2个回答

6
获取代码的热插拔功能是很棘手的,如果可能的话。这取决于变更集和正在运行的应用程序。
问题:
- 旧变量可能会污染命名空间并导致微妙的冲突、错误。 - 重新定义多个变量不是原子性的。
在一个命名空间中可能存在旧变量,如果您重新定义一些函数并保持应用程序运行而没有重启,则这些变量将不存在于应用程序重启时。另一个问题是原子性:重新定义多个函数,即更改多个变量不是原子性的。如果您更改某个命名空间中的函数,而其他命名空间中的代码依赖于该函数,则使用新代码重新加载命名空间不是原子性的。
通常情况下,您最好采用以下方法之一:
1. 让代理程序暂停请求,直到您的应用程序重启。 2. 启动一个新的应用程序实例,与“旧版本”并行,并使用代理程序在新版本准备好处理请求后切换到新版本。

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接