一般情况下,游戏服务器都会需要处理玩家数据,所以内存里必然保留了一些数据的,如果用reload去让修改的代码生效,因为会先onWorkerStop,再调用onWorkerStart,虽然客户端与gate间的连接并不会断开,但是处理业务的worker被stop并start后,子进程中的内存数据难道还会存在吗?
如果已经不存在了,那这个reload似乎就没有用了,跟重启服务器有何区别!请大佬解释下,这是本人最近的困惑!
除非你这个reload是仅仅让修改的代码生效,但是内存中的数据都不变!
1、区别是:
(1)restart重启是一次将所有的进程全部退出并重启,可能会造成服务暂时不可用。
(2)reload则是安全重启进程,即原子进程一个一个的退出,然后新子进程一个一个的重启,可以避免服务暂时不可用的弊端;另外reload主要用在业务代码有更新的场景下。
2、共同点是:
因为都会经历进程的退出然后重建,所以势必都会造成进程内业务数据的丢失,可能解决方案是:
将业务数据持久化到存储设备,当进程重启时在onWorkerStart从存储设备重载业务数据。
根据你的描述,我的猜测应该是对的,进程都是有退出和重建。所以只要有业务是依赖于内存中的数据,那这种方式必然受到影响,所以restart和reload对我们来说,应该没什么区别!
你说的reload可以避免服务器的暂时不可用,应该是针对新连接到来,至少还能有一个worker能处理业务罢了,但是原先处理这个连接的worker如果重启了,那这个连接中对应的内存数据就没有了,这个进程如何能在重启后重新处理这个连接的业务呢,显示是不能了!
所以除非把所有内存数据都搬到内存设备(如redis),否则你这个restart和reload对开发者而言几乎没有区别!所以平滑重启也只是一个虚有其表的表象而已,一般的重启也都是很快的,反正reload也会导致业务数据需要重新建立,那短暂的服务器不能提供服务又如何不能接受呢?!根本 没啥区别!
谢谢您的回复!
1、大体如此,对于 reload 或 restart 这种只要是涉及进程重建的指令,原进程内存中的数据肯定会丢失。
2、另平滑重启指的是 reload 或 restart 带 -g 参数的 gracefully 指令,和普通的重启可不是一样的,它会在每个进程的所有请求处理完毕后才会重建进程,当然对于条1也是不可避免的。
-g参数是能保证所有请求都处理完成后才重启是吧,OK!