关于 Node 部署更新的一些探讨
发布于 5 年前 作者 Sirormy 3961 次浏览 来自 问答

最近一段时间在做 Eggjs 相关的项目,关于单机部署有一些疑问:

该如何做到服务不中断更新呢?

最原始的更新方式是: 代码更新、服务重启,这段时间用户服务是中断的体验不好。 我想到的优化方案是: Nginx 在前边做一层负载,服务器下做启动两个服务端口分别是 9000 和 9001, 部署的时候, Nginx 去掉 9000 的负载,重启 Nginx;9000 端口停止服务,代码更新,重启 Eggjs; Nginx 加上 9000 的负载,关闭 9001 的负载;9001 端口停止服务,代码更新,重启 Eggjs; Nginx 加上 9001 的负载,重启 Nginx; 更新完成。

这样操作有两个问题:一是操作极其繁琐,二是 Eggjs 服务器里有初始化和定时任务,如果做负载的话,代码上还要做区分,感觉还是不够优雅。 诸位有什么比较优雅的解决方式吗?

5 回复

一是操作极其繁琐

你的那个方案,不就是 SLB 的基本功能么? 这种一般都是运维平台搞定了,尤其是 docker k8s 后。

二是 Eggjs 服务器里有初始化和定时任务

不太明白你的问题是什么,集群情况下,本来 Egg 就应该不应该依赖单机的初始化和定时任务。

正常操作,习惯就好,我也是这样。两台服务器,阿里负载关闭v1 ,然后copy文件,pm2 restart app 负载开启v1,关闭v2 然后copy文件,pm2 restart app 开启v2

@atian25 关于一,确实是这样的,考虑用 SLB 来处理了。关于二,初始化和定时任务要拆分出来作为独立服务的话,那么原项目中的一些 Service 和 Model 层要抽取出来作为组件来复用吧,是不是可以这样理解呢?

@Sirormy 不是,我的意思是没看懂你 二 的问题是啥

我猜测你指的『定时任务』是想集群调度,一个集群中只有一台机器的一个 worker 执行任务。这个是必须依靠第三方服务来实现的(如 redis 分布式锁或消息服务之类的)来扩展 egg-schedule

@atian25 天大说的对,这边有一个 worker 每天在跑一些数据计算和入库,如果两台机器的话,就会有两个 worker 在跑,控制好唯一 worker 是这块的技术点,我再去翻翻 schedule 相关的文档,谢谢提供思路。

回到顶部