对安全关服的支持

前言

我们通常使用kill命令去关闭一个,在单进程序中,程序结尾一般都会有收尾的关闭动作。skynet并没有对收尾动作做太多文章,对于skynet.abort()也只是粗暴的关闭掉所有服务,清除掉所有未处理的消息。
但是在实际应用开发中,我们通常需要做一个收尾处理,比如orm缓存的修改进行同步、把在线的玩家都踢出。

实现方式

对于skynet,不太好依赖信号去处理,信号那需要阻塞等待所有服务都完成收尾动作。我想到的另一个方案是依赖make/script/stop.sh发送一个shutdown命令到contriner_mgr,contriner_mgr再下发shutdown命令到所有服务,关闭顺序为先启动后关闭,因为先启动的服务一般都被后启动的服务依赖,一直到所有服务都执行完shutdown流程,stop.sh脚本才会执行kill命令,确保安全关服。

业务层对接处理

只需要引入local skynet_util = require "skynet-fly.utils.skynet_util"模块,增加对应方法就行。

1
2
3
4
5
6
skynet_util.reg_shutdown_func(function()
log.warn("-------------shutdown save begin---------------",g_config.instance_name)
G_ISCLOSE = true
g_orm_obj.save_change_now(g_orm_obj)
log.warn("-------------shutdown save end---------------",g_config.instance_name)
end)

对安全关服的支持
https://huahua132.github.io/2023/10/12/skynet_fly_word/word_2/G_shutdown/
作者
huahua132
发布于
2023年10月12日
许可协议