如何实现热更新

热更新的优点

热更新是一个绝对很酷的功能.简单来说,它的好处有两点:一个是提高开发效率,一个是在线上修复问题.可能有些同学不太理解,毕竟大家的技术背景不太一样,所以这里还是展开来讨论一下.

先说开发效率.我以前曾经做过一段游戏服务器的开发,与web服务器不太一样的是,游戏服务器通常需要在启动的时候加载很多数据进来.如果你使用的是编译型语言做游戏服务器的开发,那么假如进行了一些修改,除去编码-编译的过程不说,每次重启服务器验证时加载数据的时间都够你上个厕所的.所以,基本上现在做游戏服务器的开发,如果完全使用编译型语言,那么会很苦逼,一般都采用编译型语言结合脚本语言的方式.

有了脚本语言的热更新功能,还是刚才的工作场景,不仅没有了编译的过程,而且还不需要重启服务器了.在使用了Lua来编写游戏服务器的逻辑之后,我经常一整天都不需要重启服务器,就可以完成整个工作,开发效率提高了很多.

也正是因为热更新能使得不需要重启服务器就能更新代码,所以也可以用在线上修复问题.

热更新的缺点

前面说的只是热更新的优点,也需要提一提热更新的缺点.

脚本语言虽然不需要编译,但是这也存在一个缺陷,就是代码要到运行时才能跑到,也只有到那个时候才能知道代码有没有问题.换言之,需要非常多的测试覆盖来保证脚本的正确性.

另外,前面提到热更新能在线上修复问题,但是不能因为这样就过度依赖这个特性,更不能把修复变成了新增功能,热更新修复线上问题是实在万不得已才为之的.

使用qnode如何实现热更新

要支持项目的Lua脚本热更新,在qnode中需要做一些特殊的事情.以examples/qcached中的memcached服务器为例来说明.

该项目中在配置文件中指定加载的主文件是main.lua,来看看它的内容:

require("util")

require_ex("server")
require_ex("child")

该项目除了main.lua之外,还有另外两个Lua文件:server.lua和child.lua,所以这里main.lua在启动时调用util提供的函数require_ex来加载这两个文件.

所有需要支持热更新的文件,在加载的时候都需要使用require_ex函数来加载.

当修改了代码需要热更新验证时,可以向qnode服务器发送USR1信号来让服务器重新加载,这在根目录中reload.sh脚本中已经封装了该操作.

简而言之,需要支持热更新的项目文件组织应该是这样的:由配置文件指定的服务器启动脚本文件中,使用require_ex函数来加载所有该项目的脚本文件,在需要热更新的时候发送USR1信号来通知服务器,它将按照顺序重新加载所有的脚本文件.

猜你喜欢

转载自blog.csdn.net/qq_41786318/article/details/81020102
今日推荐