-
只要实现了进程级别的无状态(或在重启时恢复状态),除了跨过"重启期间"的连接会受到影响这个问题之外,我们还可以通过重启进程的方式实现热更新
-
优雅的进程切换
在热更新期间,新旧经常会同时运行,旧进程处理旧的请求,等处理完全部请求之后,再退出,而新进程则负责处理新的请求 -
利用fork,exec切换
利用fork、exec函数实现进程切换,原理:fork和exec函数有一个重要的特性,即可以让复刻后的进程和新开启的进程继承原进程的文件描述符,因此新进程也可以直接访问原进程监听的端口的socket。
如上图说明了fork和exec函数实现优雅进程切换的流程,进程1是一个服务端程序,监听8001端口,客户端A正在与服务端进行交互。当需要热更新时,让进程1调用fork函数,系统会复刻一个与进程1一摸一样的进程2,两个进程共同监听8001端口。让进程2调用exec函数运行新版本的程序,新版本程序进程3继承了原有的监听端口。此时,可以让进程1停止接收新连接。客户端A可以继续与进程1进行交互,而新的连接会与进程3交互。待到进程1处理完客户端A的请求后,再让它退出,系统仅剩下进程3。如此便实现了优雅的进程切换。由于进程3和进程1都监听8001端口,因此客户端无须做任何改变。 -
利用网关实现热更新
除了使用fork和exec函数,利用网关也能够实现优雅的进程切换。如图9-20所示的是一种带有网关的服务端架构,客户端与网关相连,网关再将消息转发给逻辑进程(图中的game1)。<