如何在部署clojure Web服务时减少重新加载时间?

时间:2015-06-30 07:04:35

标签: clojure

我使用Linux / upstart来启动我的jar。 我是这样做的:

  1. lein uberjar制作myapp.jar
  2. 通过scp将myapp.jar复制到专用服务器
  3. ssh到专用服务器
  4. 停止myapp.jar
  5. 将jar复制到目标目录(因此新贵可以找到它)
  6. 启动myapp.jar
  7. 有几个问题:

    1. 制作步骤1,2,3和6很无聊。我认为可以在脚本中执行此操作,但我不确定在之前替换myapp.jar 是个好主意停止myapp。在运行时更改jar文件是否安全?
    2. 步骤5和7之间的延迟约为10秒。是否可以立即更新 myapp.jar ?更有趣的是:是否有可能在现场更新:例如我已打开连接,我想保存它们。
    3. 是否有可能像Erlang那样做?部署,如果失败,将加载以前的版本。

1 个答案:

答案 0 :(得分:0)

您的问题由几部分组成,让我分别回答。

您说得对,替换jar文件不是一个好主意。您最好备份文件(将其复制到backup目录中),而不是仅仅覆盖它。

如果您真的对启动时间和停机时间间隔感到好奇,可以使用多种选择。首先,要维护一个具有多个工作节点和一个代理的布局,该代理在它们之间分配传入的请求。因此,您更新了第一个节点,当它脱机时,所有请求都转到第二个节点。然后更新第二个就可以了。但这要求您首先获得一些操作技能。

第二个选项是,您执行热代码重新加载。简要地说,在生产服务器上公开一个nREPL端口。然后,您可以从Emacs或任何其他编辑器连接到它,打开一个更新的名称空间,然后按C-c C-k来评估远程计算机上的整个名称空间。结果,您可以在运行时更新代码,而无需重新启动计算机。但是请记住,更改将不会在重新加载后保存。

一个小提示,您最好使用Ansible自动化该过程。它是您在YAML文件中声明操作的工具。结果将是一组看起来简单易维护的指令。 Ansible考虑了很多事情。例如,当您尝试覆盖文件时,它可以自动创建备份。