【IT168 评论】游戏的定期更新版本已经再寻常不过了,但频繁的更新会造成流失率非常严重,哪个玩家也不希望再BOSS将要躺下那一刻,服务器停机维护了。在小版本更新过程中,采用不停机维护成为现在游戏的主流方式,那究竟是如何做到不停机维护的呢?
事实上,大多游戏服务器分为逻辑程序服务器和数据库服务器,如果是线上运营的服务器,基本上是在至少两台主机上,在发现几个逻辑服务器中的bug,或者加了某些功能,比如少加了三个金币,多算了一点经验等,只需要在测试服测试完毕,上传覆盖执行文件(jar或php),但是依然要重启逻辑服务器进程。
而Erlang的热升级技术,就带了更好的体验。Erlang原本脱胎于电信行业,Jow Armstrong 在描述Erlang的设计要求时期中就提到了“软件维护应该能在不停止系统的情况下进行。”在实践中,我们也因为这种不停服务的热更新获益良多,终于不用再等到半夜没人的时候再做更新了,对于一些紧急的bug修复,热更新实在是一把利器。
Erlang热更新的秘密其实都集中在code模块,code模块是Erlang Code Server暴露出来的对外接口其职责就是把已经编译好的模块加载到Erlang的运行时环境。
代码版本有两个概念 当前版本代码'current'和老版本代码'old',一旦模块被加载就变成'current',再有一个版本过来被加载,之前的版本就变成'old',新加载的变成'current'。这时候,两个版本还是同时存在,新的请求执行的时候会使用新的版本,而老版本的代码还会被使用因为还有其他模块的调用'old'版本中。如果再进行一次热更新,这时就有第三个实例被加载,code server就会终止掉还在驻留在'old'版本代码依赖的进程。然后第三个实例成为'current',之前版本的'current'被标记成'old'。
这种方法有效降低了因版本升级而导致的用户流失。当然,实现不停机更新的技术方法还有很多,欢迎一起交流经验。