我开始了一个项目,我开始有很多网络流量,在某些时候,我对如何将项目扩展到生产环境感到不安全,这有两个问题:
- 如何在不让我的用户没有服务的情况下执行更新?
- 如何正确配置节点.js使其消耗更少的内存?
我有微服务与Hydra-express一起工作,但我无法实现Hydra路由器,我使用Express.js;我也有NGINX作为代理网关。
我正在用 ES6 编程,使用 BABEL 进行转译并使用 PM2 维护活动的微服务,其中一些使用 fork,最重要的是在集群模式下。
我正在考虑使用 docker,但我还没有找到任何关于如何将其与 CDN 一起使用、上传文件并将其提供给用户的教程。
不可能给出 2 的明确答案,因为这完全取决于应用程序的功能,没有可以应用的银弹配置。
这就剩下第一点了,即所谓的零停机时间。
因此,在有多个服务器将内容返回给用户(例如 http 服务器)的上下文中,我想可以公平地说,大多数生产环境在前面都有与业务逻辑无关的东西。这可以是负载均衡器(有多种形状和形式)或反向代理。这通常是您指向 DNS A 记录的位置。此服务器基本上永远不会关闭。
现在,假设您更改了一些业务逻辑,并希望部署新的后端。您通常要做的是逐个交换负载均衡器(或反向代理)后面已经运行的进程。因此,如果您有五个节点进程,则停止一个,使用更新的代码启动一个新进程,然后重复,直到所有正在运行的进程都被换出。
您也可以利用它来换掉一个,对那个运行测试,然后继续换掉其余的。
为了真正确保不会中断任何用户,您应该停止在旧进程上接受新的 http 请求,以便将新的 http 请求路由到更新的进程。这将允许正在发生的 http 请求完成。然后停止旧进程。
希望这有帮助。
除了@ralphtheninja答案之外,我建议您阅读更多关于蓝绿部署的信息,正如Martin Fowler所提出的那样; https://martinfowler.com/bliki/BlueGreenDeployment.html
自动化部署的挑战之一是转换本身,将软件从测试的最后阶段带到实时生产。您通常需要快速执行此操作,以最大程度地减少停机时间。蓝绿部署方法通过确保您拥有两个尽可能相同的生产环境来实现这一点。在任何时候,其中一个,比如蓝色,都是实时的。当您准备软件的新版本时,您将在绿色环境中进行最后阶段的测试。一旦软件在绿色环境中工作,您就可以切换路由器,以便所有传入的请求都进入绿色环境 - 蓝色环境现在处于空闲状态。
蓝绿部署还为您提供了一种快速回滚的方法 - 如果出现任何问题,您可以将路由器切换回蓝色环境。
我不知道您的后端在哪里运行,但有一些服务可以为您完成,例如AWS ElasticBeanstalk将您的实例放在负载均衡器后面,并根据策略管理部署。 看一看; https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html。