网上一直说reload是0秒平滑更新,但是我今天在试的时候发现。当reload创建完新的进程接收请求后就会关闭旧进程。此时,旧进程里正在连接的socket会被强制关闭(准确来说应该是进程整个被Kill了),而不是等待它完成再关闭。 然后gracefulReload我也试了,也差不多。并不会照顾到当前正在连接的socket。 所以想问一下,难道就没有一种办法,让pm2创建新进程接收新的请求,同时等待原进程的所有请求完成后再关闭旧进程。
用两个进程和两个端口来回切换, 然后用nginx做LB, 旧程序端口weight降级 估计可以
@dbit-xia 感谢你消灭0回复。 你说的方法可行。我们目前就是用负载均衡去切流量。 但是考虑到每次更新都得切来切去不方便,所以有了此问。 我已经测试确认,使用pm2的gracefulReload,然后自己实现接收sigint信号自行决定关闭时间。 基本可以实现平滑更新。
@Gitforxuyang 可以分享一下代码吗? 我之前做过pm2 cluster 平滑更新,还没有成功过~~,不知道什么原因。。
@ssttm169 可以,稍等。我闲了把代码整理一下发上来
@dbit-xia 学习了
@Gitforxuyang 代码整理出来了吗~?
@ssttm169 因为cnode论坛回复篇幅有限,所以我写在了自己的博客上。 这是初稿,有一些不严谨的地方我后期还有完善。但大致的实现逻辑没有问题。下面附上pm2平滑更新的链接: https://www.xuyang.site/template.html?topnav=思维火花&page=article&idx=27