发布处理原理

Erlang编程语言的一个很重要的特点是能在运行时变更模块代码,即Erlang参考手册中所描述的代码替换

基于这个功能,OTP应用SASL提供了一个用于在运行时对整个发布的不同版本之间进行升级和降级的框架。这就是我们称之为发布处理的东西。

该框架由用于生成脚本和构建发布包的离线支持工具( systools )和用于解压和安装发布包的在线支持工具( release_handler )组成。

因此,我们要注意基于 Erlang/OTP,并启用发布处理的系统,最少由Kernel、STDLIB和SASL组成。

  • 一个发布是由前一章 发布 中所描述的方式创建的。然后该发布被传输并安装到目标环境中。关于如何安装首个目标系统的信息,请参考系统原理(System Principles)。
  • 在开发环境中对代码进行修改,比如错误修正。
  • 在某一刻,可以发布一个新的版本了。会更新相关的 .app 文件并写入一个新的 .rel 文件。
  • 对于每个被修改过的应用,会创建一个 应用升级文件 , .appup 文件。在该文件中描述了如何在应用的新旧版本之间升级或降级。
  • 根据 .appup 文件,会创建一个 发布升级文件 。这个文件描述了如何在整个发布的新旧版本之间升级或者降级。
  • 生成新的发布包并传输到目标系统。
  • 使用发布处理器解开新的发布包。
  • 还是使用了发布处理器,安装了新版本的发布。这是通过运行 relup 中的指令来完成的。可能会添加、删除或者重新载入模块,启动、停止或重启应用等等。某些情况甚至需要重启整个虚拟器。如果安装失败了,系统可能被重启,然后自动使用旧的发布版。
  • 如果安装成功了,新版本会成为默认的版本,现在如果系统重启了,那么它会被自动使用。下一章 Appup Cookbook 包含了 .appup 文件的一些例子,是一些通常在运行时较容易处理的一些典型的升级、降级案例。但是,还有方方面面的因素会让发布处理变得很复杂。说一些例子:

  • 复杂的或者环形的依赖会导致很难甚至不可能确定升级或者降级的次序而不出现运行时错误。依赖可能是:

    • 节点之间,
    • 进程之间和
    • 模块之间。
  • 在发布处理过程中,未受影响的进程将继续正常的执行。这可能会导致超时或者其他问题。例如,在挂起使用某个模块的进程并载入该模块的新版本的时间窗口内,新的进程创建了,可能还在继续执行旧的代码。因此推荐以尽可能小的步骤变更代码,并且始终保持向后兼容。