前段时间发帖子问了一下关于nodejs热重启的问题,感谢论坛里几位活跃的朋友提点(coordcn,imacc等等,不一一列举了,原提问帖在这里:https://cnodejs.org/topic/552e06816966089a258141e0)。最近和同事一起研究了一下pm2,经过测试,pm2确实可以实现0 downtime,具体就是使用pm2的 reload外加cluster模式:
pm2 start app.js -i 1
按照pm2的文档,-i N是在cluster模式下启动N个worker。pm2的这个机制是对nodejs原生cluster的一个封装,不必自己写复杂的cluster代码,而直接由pm2管理cluster,还支持各大常见的框架(Express,koa等),真是太强大了,即便监听了某个端口或者unix socket文件,在pm2的管理下也不会出现EADDRINUSE的错误。
当需要更新代码的时候,只需调用pm2的reload命令即可:
// update the code
pm2 reload app.js
按照这篇文章https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/ 的提示:
PM2 reload <app name> feature will restart your workers one by one, and for each worker, wait till the new one has spawned before killing the old one.
This way, your server keeps running even when you are deploying the new patch straight to production.
在cluster模式下,pm2会尝试按顺序重启不同的worker,对于每个worker,只有在新的实例重启成功后才会杀死把旧worker杀死。所以reload的时候,还是可以保持服务一直能够响应,当reload结束后,新的worker已经开启,新代码就可以正常工作了。整个过程中,不会出现no responsing的问题。