Erlang 热更新
Erlang之父Joe Armstrong在描述Erlang的设计要求时,就提到了软件维护应该能在不停止系统的情况下进行。在实践中,我们也因为这种不停止服务的热更新获益良多。那么Erlang是如何做到热更新的呢?这就是本文要讨论的问题。
如何使用Erlang进行热更新?
Erlang有以下几组API提供选择:
使用erlang:check_process_code(Process, Module) 判断有没有进程在使用模块时,do_purge直接杀了使用模块的进程,而do_soft_purge则返回false
erlang能否做到自动热更新?
答案是有的,但这里有一些概念必须要理解。
erlang允许一个模块同时有两个版本加载到运行时系统,一个旧版本,一个当前版本。在加载一个模块时,运行时系统会先检查这个模块是否已经有一份代码存在,如果存在,则把已存在的代码作为旧的代码,新加载的代码作为当前版本。如果有第三份代码加载进系统,则原来的旧版本代码会被清理掉,跟此版本代码相关的所有进程都会被结束;原来的当前代码变为当前的旧版本代码,第三份代码成为当前版本。
函数调用有两种方式:一种完全限定调用(Mod:Func),包括模块内、模块之间这种方式的调用,以及模块之间通过import指令导入其它模块,再直接通过函数名调用;一种直接调用(Func),只能被模块内的函数调用,相当于私有函数。完全限定的函数调用总是引用当前版本代码。旧版本代码只可能通过直接调用的方式引用到。
1> c(m).{ok,m}2> m:init().loop again:1{ok,<0.39.0>}%% 将test函数返回值改成23> c(m).{ok,m}4> pid(0,39,0)!code_switch.loop again:2code_switch
