【问题标题】:CI/CD on a production backend server生产后端服务器上的 CI/CD
【发布时间】:2020-08-24 00:02:27
【问题描述】:

我正在开发一个应用程序,并且我希望能够快速迭代版本(修复错误和添加功能等),因此执行此操作的明显途径是开发 CI/CD 工作流程。前端很简单,只需将我的服务器提供的资产换成新版本,当人们访问该站点时,这些资产就会被提供。但是,我不太确定如何更新由 express 和 node 提供支持的生产后端服务器。在开发中,我可以轻松地重新启动服务器以反映新的更改,但是在生产环境中这样做可能会对在更新时使用我的服务的用户产生不利影响。

总的来说,我的问题是在不停机/中断使用的情况下将新的后端服务器更新推送到我的生产环境的最佳方式是什么?

【问题讨论】:

    标签: node.js express continuous-integration continuous-deployment


    【解决方案1】:

    理想情况下,您需要运行某种进程集群。

    这背后的第一步是确保您的应用程序是完全无状态的,并且您可以同时运行快速服务器的多个副本以实现负载平衡。

    如果您确实需要维护某种形式的状态,您可以使用 Redis 等基于内存的存储在服务器实例之间共享状态。

    一旦您有了这样的架构,您就可以引导和限制流量,使集群中的每个服务器实例都有机会重新启动,而没有流量指向它。

    假设您有 4 个实例在运行您的服务器。您将关闭实例 1,您的负载平衡会将您的流量发送到 2、3 和 4。

    在此期间,您可以热重新加载或完全重新加载实例 1。然后重新打开实例 1 并使用 2、3 和 4 重复该过程。

    这样的过程称为“滚动更新”

    【讨论】:

    • 好吧,请耐心等待,因为我是后端开发的新手,但我还有一些问题/澄清。所以我应该有多个服务器实例连接到我的域,我假设这将负载平衡,如果我错了,请纠正我。我也使用护照来处理身份验证,但我的会话确实有一个数据库存储,所以我假设通过将这些实例连接到存储然后它们可以共享身份验证状态?除此之外,我的服务器只是动态地从 db/does 计算中提取东西,所以我觉得我很好
    • 要注意的主要事情是您是否持有,并在应用程序内存中的请求之间重用变量。想象一下,您的 API 请求生成一个数字 - 5- 并将其存储为 generatedNumber。然后另一个 API 请求尝试访问生成的数字以返回它。在这种情况下,您需要将这样的变量临时存储在 Redis 之类的东西中,以允许所有实例访问它。至于负载平衡,有很多解决方案。研究在你的应用程序前面使用 Nginx nginx.com/blog/nginx-unit-updating-apps-with-100-percent-uptime
    • 澄清一下,该链接是关于实施一种类似于滚动更新答案中描述的方法。您还可以使用 Nginx 让多个“侦听器”来负载平衡您的流量并实现类似的结果。
    • 我很确定我的 API 只在端点之间共享一两次内存变量,这只是为了在注册期间保存临时用户数据,然后再将其提交到我的数据库。那我会研究一下Redis。另外,感谢您提供的链接,尽管我通常不是 nginx 的最大粉丝,但我肯定会对此进行调查
    • 您还应该使用 pm2 或类似的进程管理器来为每个 CPU 内核运行 1 个实例。通常 Node 在单个内核上运行,因此这将通过平衡所有内核的负载来大大提高您的性能。您可以使用它而不是 Nginx 与单个 VPS 来实现相同的结果:) 至少在您超出单个 VPS 的性能或位置限制之前pm2.keymetrics.io/docs/usage/cluster-mode
    猜你喜欢
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2020-05-01
    • 2021-06-30
    • 1970-01-01
    • 2018-03-16
    • 2014-05-16
    • 2012-02-19
    相关资源
    最近更新 更多