暴力的重启服务方案
成都创新互联主营开化网站建设的网络公司,主营网站建设方案,App定制开发,开化h5成都小程序开发搭建,开化网站营销推广欢迎开化等地区企业咨询一般服务器重启可以直接通过 kill 命令杀死进程,然后重新启动一个新的进程即可。但这种方法比较粗暴,有可能导致某些正在处理中的客户端请求失败,如果请求正在写数据,那么还有可能导致数据丢失或者数据不一致等。
那么有什么方式可以优雅的重启服务呢?
优雅的重启服务方案
优雅的重启方式流程如下:
从上面的流程可以看出,旧进程必须等待所有的请求连接完成后才会退出,请求不会被强制关闭,所以是个优雅的重启方式。
使用Go实现优雅重启
下面我们使用Go语言来演示怎么实现优雅启动功能,我们先来看看原理图:
从原理图可以知道,重启时首先通过发送 SIGHUP信号 给服务进程,服务进程收到 SIGHUP信号 后会 fork 一个新进程来处理新的请求,然后新进程会发送 SIGTERM信号 给旧服务进程(父进程),旧服务进程接收到 SIGTERM信号 后会关闭监听的 socket句柄 (停止接收新请求),并且等待未处理完成的请求完成后再退出进程。
下面通过代码来说明这个流程,代码主要参考 endless 这个库,有兴趣可以查看其源码。
首先我们定义一个名为 endlessServer 的结构并且继承 http.Server 结构:
type endlessServer struct { http.Server EndlessListener net.Listener wg sync.WaitGroup sigChan chan os.Signal isChild bool state uint8 lock *sync.RWMutex }
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。