还有node.js怎么实现不重启服务更新配置文件?
望大神们指教!!!
用 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 也可以。 不过使用的时候要谨慎些。
@NextZeus 『一行 delete require.cache 引发的内存泄漏血案』
前几天不就是在讨论这个么 https://cnodejs.org/topic/5aaba2dc19b2e3db18959e63
@ipengyo 实验性质的不谈,生产环境基本是这个套路吧
@ipengyo 成熟的通用方案不用,自己折腾这种 hack 方法,还存在极大的内存泄露风险,这样就不觉得麻烦? 而且你搞集群的话,本来就需要 LB 的了。
如果只是更新配置文件,那就做个订阅更新变量即可,也不需要用到重启。
node,js 没有热部署。从理论上做不到。
@atian25 注意点就不会出现这种情况 不是说不能用 不能一砖头拍死这个方案
@NextZeus @NextZeus 除了要自己构造模块引用关系表,以便清除所有引用到的地方,你要热更新的文件里如果创建了 timer,socket 等资源属性的东西清除前还要手动释放,我觉得这已经超出【注意点就行】的范畴了,花这么多精力,不去直接做 lb 多快
来自酷炫的 CNodeMD
@NextZeus
如 @hyj1991 所述
花这么多精力,不去直接做 lb 多快
其实不是 做 lb 而是 用 lb,都是社区现成的方案了,直接拿过来用就好了,就一次性学习成本而已。
做 lb
用 lb
而不是自己折腾 hack 技巧。更何况业务一发展,肯定要横向扩展做集群,一样要上 LB 。
@atian25 @hyj1991 lb全称叫什么?涨一下知识
来自 CNodeMD
@thonatos @atian25 社区现成的方案在哪里?链接可以发一下吗
这里小小的咨询一下你们的负载是指Nginx那种,还是Docker集群那种?
可以用 envconsul
经常会动态更新的配置,一般都用第三方存储啊
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
用 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 也可以。 不过使用的时候要谨慎些。
@NextZeus 『一行 delete require.cache 引发的内存泄漏血案』
前几天不就是在讨论这个么 https://cnodejs.org/topic/5aaba2dc19b2e3db18959e63
@ipengyo 实验性质的不谈,生产环境基本是这个套路吧
@ipengyo 成熟的通用方案不用,自己折腾这种 hack 方法,还存在极大的内存泄露风险,这样就不觉得麻烦? 而且你搞集群的话,本来就需要 LB 的了。
如果只是更新配置文件,那就做个订阅更新变量即可,也不需要用到重启。
node,js 没有热部署。从理论上做不到。
@atian25 注意点就不会出现这种情况 不是说不能用 不能一砖头拍死这个方案
@NextZeus @NextZeus 除了要自己构造模块引用关系表,以便清除所有引用到的地方,你要热更新的文件里如果创建了 timer,socket 等资源属性的东西清除前还要手动释放,我觉得这已经超出【注意点就行】的范畴了,花这么多精力,不去直接做 lb 多快
来自酷炫的 CNodeMD
@NextZeus
如 @hyj1991 所述
其实不是
做 lb而是用 lb,都是社区现成的方案了,直接拿过来用就好了,就一次性学习成本而已。而不是自己折腾 hack 技巧。更何况业务一发展,肯定要横向扩展做集群,一样要上 LB 。
@atian25 @hyj1991 lb全称叫什么?涨一下知识
来自 CNodeMD
@thonatos @atian25 社区现成的方案在哪里?链接可以发一下吗
来自 CNodeMD
来自 CNodeMD
这里小小的咨询一下你们的负载是指Nginx那种,还是Docker集群那种?
可以用 envconsul
经常会动态更新的配置,一般都用第三方存储啊