Erlang原本脱胎于电信行业,Jow Armstrong 在描述Erlang的设计要求时期中就提到了“软件维护应该能在不停止系统的情况下进行。”在实践中,我们也因为这种不停服务的热更新获益良多,终于不用再等到半夜没人的时候再做更新了,对于一些紧急的bug修复,热更新实在是一把圣剑(至秦玩dota的时候喜欢出圣剑),热更新的具体使用,以及它具体的运行过程是怎样的呢?
在我们自己使用热更新之前,曾经读过这么一篇博客,博主叫 坚强2002,博文叫 erlang热更新,在这篇博文中,对erlang的 code server 对于运行的代码进行热更新的细节作了很详细的分析,非常感谢这位坚强2002热心的分享,结合这篇图文并茂的博文和erlang的官方文档上的介绍后,我才得以对erlang 的热更新有更为直观的印象。
erlang 热更新的秘密都集中在code模块,code模块是Erlang code server 暴露出来的对外接口,其职责就是把已经编译好的模块加载到运行时环境。在erlang 的内核kernel中有着这么一个code server 它负责代码的运行时管理,我们在erlang的控制台输入 appmon:start().
然后点击kerner 我们就能看到神秘的code server 模块了
最左边的就是了。
代码的加载方式:
erlang在启动系统时,有embedded和interactive两种启动模式,默认是interactive模式启动,也可以通过设置启动参数把它设置成embedded启动:%erl -mode embedded
这些在官方文档中都有说明。这两种方式有什么区别呢?
embedded模式受应用场景的先知,模块的加载都是需要显示指定code server 加载模块的顺序,一般在启动脚本中指定加载顺序。当然也可以在启动之后再使用code模块的函数来作明确的加载。
然而
interactive模式在系统启动的时候只有部分代码会被加载,通常都是一些运行时自己需要的模块,其他的代码模块都是在第一次被调用的时候动态加载,当调用一个方法时发现一个模块没有加载,code server 就会搜索并加载模块。
在interactive模式下,code server维护了一个搜索代码路径的列表,通常称作 code path, code 模块的 set_path(Path) , get_pat