node应用热部署方案

974 阅读1分钟

方案1:逐步重启worker进程

具体实现: github.com/xuezier/egg…

问题:

  1. 无法优雅的解决当前worker进程正在处理的请求,以及一些延时的任务
  2. 无法控制流量,master进程任然会分配请求给当前杀死的进程

方案2: 针对SSR的依赖的js bundle文件,添加版本

具体实现:依赖携程apollo实现

验证delete require.cache:codesandbox.io/s/happy-pto…

问题:

  1. 是否存在内存占用过多的问题
  2. 如何保证新发布的版本在更改版本号之前生效

方案3:delete require.cache

具体实现:参考基于nodejs线上代码热部署原理与实现

问题:

  1. 内存管理的问题, 参考一行 delete require.cache 引发的内存泄漏血案

方案4:使用PM2进行管理

具体实现:

服务的启动和守护,不使用egg-scripts,改用PM2.

代码如下,来自egg官方

// server.js
const egg = require('egg');

const workers = Number(process.argv[2] || require('os').cpus().length);
egg.startCluster({
  workers,
  baseDir: __dirname,
});

启动命令,改用pm2

pm2 start server.js

问题:

image.png

方案5:SLB(服务器负载均衡)

具体实现:

问题:

  1. 依赖nginx配置

参考

  1. 关于eggjs热部署问题
  2. Egg.js 多机平滑重启实践
  3. eggjs 的单机热部署
  4. egg-deploy
  5. LB 负载均衡的层次结构
  6. Egg.js 进程管理为什么没有选型 PM2 ?