优雅退出机制与原理

Netty优雅退出机制和原理

好久不见. 提交于 2019-11-29 15:34:40
1. 引言 2. 进程的优雅退出 2.1 Kill -9 PID带来的问题 在Linux上通常会通过kill -9 pid的方式强制将某个进程杀掉,这种方式简单高效,因此很多程序的停止脚本经常会选择使用kill -9 pid的方式。 无论是Linux的Kill -9 pid还是windows的taskkill /f /pid强制进程退出,都会带来一些副作用:对应用软件而言其效果等同于突然掉电,可能会导致如下一些问题: 缓存中的数据尚未持久化到磁盘中,导致数据丢失; 正在进行文件的write操作,没有更新完成,突然退出,导致文件损坏; 线程的消息队列中尚有接收到的请求消息还没来得及处理,导致请求消息丢失; 数据库操作已经完成,例如账户余额更新,准备返回应答消息给客户端时,消息尚在通信线程的发送队列5. 中排队等待发送,进程强制退出导致应答消息没有返回给客户端,客户端发起超时重试,会带来重复更新问题; 其它问题等... 2.2 JAVA优雅退出 Java的优雅停机通常通过注册JDK的ShutdownHook来实现,当系统接收到退出指令后,首先标记系统处于退出状态,不再接收新的消息,然后将积压的消息处理完,最后调用资源回收接口将资源销毁,最后各线程退出执行。 通常优雅退出需要有超时控制机制,例如30S,如果到达超时时间仍然没有完成退出前的资源回收等操作,则由停机脚本直接调用kill -9