如何让pm2优雅的重启,不断掉tcp ip链接
发布于 7 年前 作者 justjoker 6055 次浏览 来自 问答

由于公司的业务需要,我用node写了个中间层,由于经常需要更新线上的代码,所以我用了pm2来维护线上node环境的稳定.但是每次修改代码,重启pm2就会把之前的tcp ip链接断掉,有没有办法能让pm2不断掉链接,并重启.试过文档里的 接收信号来组织进程杀死,也不知道是写的不对还是就是不好用.信号收到了,但是组织不了进程被杀死.

9 回复

reload不好使吗?

@stonephp 好使 ,但是他会把正在链接的tcp ip链接给断掉

我感觉这个做不到吧。。。reload只是实现了按进程的重启而已,tcp连接是和进程绑定的,除非能实现热更新不重启进程,不然不管怎么做都要重连的吧。。。 我们以前做过一个硬件设备和Node Server用Mqtts长连接的东西,最后也只能在客户端做重连策略

pm2有个gracefulReload指令,可以pending未来的链接,并等待旧链接断开,之后再重启。 仅针对于HTTP服务有用,而且最好做了多进程负载均衡,如果是TCP长连接的话可能就需要考虑程序内热加载的设计,不过那个比较复杂,安全性风险也高。

@libook gracefulReload 命令 我试过了,但还是杀死了进程 您说的 pending 是什么意思呢?具体要怎么实现?

@hyj1991 我感觉也做不到…

我这边做的是IM服务,用node的socket.io框架实现的,我的做法是将socket长连接服务与逻辑处理分发服务完全解耦,通过RPC进行通信,这样只要保证socket后有一台可用逻辑服务器,就可以实现在线热更新;

我觉得你可以尝试把长连接那部分业务单独抽离出来,作为单独进程运行

@justjoker 简单说就是不重启服务,由程序内部利用fs读取补丁js文件,并使用eval执行文件内容,替换内存中的原有程序逻辑,好处是可以用程序控制什么时候以及如何加载新的代码,缺点是由于使用了就eval会导致整体安全性降低。

回到顶部