CNode

node.js 怎么实现热部署,有什么成熟的解决方案吗?

问答
JJerrysShan发布于9 年前最后回复8 年前21 回复9779 浏览0 收藏

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

望大神们指教!!!

查看回复

回复 (21)

P
pinxue#1·9 年前

用 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 里搞了定时器什么的就要特别小心。

M
Michaelooo#4·8 年前

前几天不就是在讨论这个么 https://cnodejs.org/topic/5aaba2dc19b2e3db18959e63

T
thonatos#5·8 年前
引用 ipengyo@thonatos 这种方法略微麻烦哦。。

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

A
atian25#6·8 年前
引用 ipengyo@thonatos 这种方法略微麻烦哦。。

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

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

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

N
ngot#7·8 年前

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

N
NextZeus#8·8 年前
引用 atian25@NextZeus 『一行 delete require.cache 引发的内存泄漏血案』

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

H
hyj1991#9·8 年前
引用 NextZeus@atian25 注意点就不会出现这种情况 不是说不能用 不能一砖头拍死这个方案

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

来自酷炫的 CNodeMD

A
atian25#10·8 年前
引用 hyj1991@NextZeus @NextZeus 除了要自己构造模块引用关系表,以便清除所有引用到的地方,你要热更新的文件里如果创建了 timer,socket 等资源属性的东西清除前还要手动释放,我觉...

@NextZeus

@hyj1991 所述

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

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

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

X
xiaozhouge#13·8 年前

来自 CNodeMD

D
D8Ge#14·8 年前

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

H
helloyou2012#15·8 年前

可以用 envconsul

W
waitingsong#16·8 年前
引用 ipengyo@pinxue 貌似有内存泄露哦

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

T
thonatos#17·8 年前

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

N
NextZeus#19·8 年前

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

N
NextZeus#20·8 年前

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

J
JustinLiao1314#21·8 年前

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

参与回复
登录后即可参与回复。登录