node.js 怎么实现热部署,有什么成熟的解决方案吗?
发布于 7 年前 作者 JerrysShan 8267 次浏览 来自 问答

还有node.js怎么实现不重启服务更新配置文件?

望大神们指教!!!

21 回复

用 node 自带的 fs.watch() 监视配置文件修改不就好了。 当然也可以传统方案: process.on(‘SIGHUP’, function () { console.log(‘re-read config.’); }); 需要的时候 kill -HUP pid 就好。嫌 signal 不方便,也可以用进度间通信、网络通信甚至pub/sub中间件来发信号触发。 如果配置文件是 js 直接 require 进来的,记得 delete require.cache[name]; 后重新 require() 一下就好,不过要是 module 里搞了定时器什么的就要特别小心。

@pinxue 貌似有内存泄露哦~~~~~~~

@ipengyo 前两天有人就这样引发了内存泄漏

一般做法是用 load balance 嘛,如果不打算用通用解决方法,那就用 node 实现一个 lb 呗

@thonatos 这种方法略微麻烦哦。。

nginx , two node instance , 启动的时候,通过脚本去控制,先更新一个服务器,更新完了,nginx把另外一台服务停了,切换到更新好了的服务器,用户只能请求到该服务器。 然后再更新另外一台服务器。

delete require.cache 也可以。 不过使用的时候要谨慎些。

@ipengyo 实验性质的不谈,生产环境基本是这个套路吧

@ipengyo 成熟的通用方案不用,自己折腾这种 hack 方法,还存在极大的内存泄露风险,这样就不觉得麻烦? 而且你搞集群的话,本来就需要 LB 的了。

还有node.js怎么实现不重启服务更新配置文件?

如果只是更新配置文件,那就做个订阅更新变量即可,也不需要用到重启。

node,js 没有热部署。从理论上做不到。

@atian25 注意点就不会出现这种情况 不是说不能用 不能一砖头拍死这个方案

@NextZeus @NextZeus 除了要自己构造模块引用关系表,以便清除所有引用到的地方,你要热更新的文件里如果创建了 timer,socket 等资源属性的东西清除前还要手动释放,我觉得这已经超出【注意点就行】的范畴了,花这么多精力,不去直接做 lb 多快

来自酷炫的 CNodeMD

@NextZeus

@hyj1991 所述

花这么多精力,不去直接做 lb 多快

其实不是 做 lb 而是 用 lb,都是社区现成的方案了,直接拿过来用就好了,就一次性学习成本而已。

而不是自己折腾 hack 技巧。更何况业务一发展,肯定要横向扩展做集群,一样要上 LB 。

@atian25 @hyj1991 lb全称叫什么?涨一下知识

来自 CNodeMD

@thonatos @atian25 社区现成的方案在哪里?链接可以发一下吗

来自 CNodeMD

这里小小的咨询一下你们的负载是指Nginx那种,还是Docker集群那种?

经常会动态更新的配置,一般都用第三方存储啊

回到顶部