【问题标题】:How to achieve zero downtime redeployment in Node.js如何在 Node.js 中实现零停机重新部署
【发布时间】:2016-03-30 17:44:17
【问题描述】:

为我的 Node.js 应用程序实现零停机时间的最简单方法是什么?

我有一个需要重新部署的应用程序:

  • npm install
  • node_modules/.bin/bower install
  • node_modules/.bin/gulp

这些操作的结果是在名为buildgulpfile.js 目录中生成了可以运行的应用程序。在这个目录中,我有一个当前正在运行的同一应用程序实例(当前通过 forever 启动,就像这样 -- forever start server.js)。

据我所知,通过forever模块实现零停机是不可能的,所以我决定选择另一种方式。

我看到了pm2,但我发现它非常复杂(如果你不这么认为,请证明我错了)。

我也看到了naught,但我什至无法通过naught start server.js 启动我的应用程序——它甚至不会在标准输出/标准错误中打印任何内容。

我也看到了up-time,但我不明白——当我运行gulp 时,它将如何处理应该替换当前正在运行的实例所在目录中的文件的情况?

【问题讨论】:

    标签: node.js deployment gulp forever pm2


    【解决方案1】:

    关于在构建期间处理替换文件:如果这些文件被 Node.js 应用程序使用,那么所有更改都将在进程重新启动时应用(因为这些文件已加载到内存中),浏览器前端文件也可以缓存在应用程序内存中实现类似的行为(仅在重新启动或/和缓存失效时应用更改)。

    我们在集群模式下使用 pm2。

    pm2 start app.js -i

    上述命令在所有可用 CPU 内核上以集群模式启动 app.js

    零停机重启:

    pm2 gracefulReload all

    此命令按顺序重新启动所有进程,因此如果您有多个进程启动并运行,则服务器在重新启动期间始终至少有一个进程请求。 如果您只有一个app.js 进程,您可以在集群模式下启动它并运行pm2 scale app.js 2(再启动一个进程)然后运行pm2 gracefulReload all,然后再运行pm2 scale app.js 1(删除之前启动的进程)。

    虽然我认为应用重启不是零停机部署的主要问题,但我们还没有设法处理数据库迁移,因此需要完全关闭应用才能应用数据库更改。此外,在部署期间用户获取新版本的浏览器前端文件时,也可能存在问题,但 AJAX 请求是由旧版本的服务器进程处理的,在这种情况下,粘性会话和 API 版本控制就派上用场了。

    【讨论】:

    • "如果 Node.js 应用程序使用这些文件,那么所有更改都将在进程重新启动时应用" -- 不,如果我重命名 node_modulesbower_components 目录,应用程序将拒绝上班
    • 如果 Node 应用程序已经启动并运行,您甚至可以删除 node_modules 并且应用程序仍将启动并运行(最终重新启动将破坏所有)。如果您直接从node_modulesbower_components 提供文件,那么是的 - 有问题。我的解决方案是将这些文件缓存在应用程序内存中并从那里提供服务。所以主要思路是运行所有的构建任务,然后优雅的重启应用。
    • “如果您直接从 node_modules 或 bower_components 提供文件,那么是的 - 有问题” - “直接提供文件”是什么意思?我只是在服务器文件中require 它们并通过浏览器文件中的script 标签链接它们,但我仍然不能只重命名/删除这些目录
    • 我的意思是“直接提供给浏览器”“通过浏览器文件中的脚本标签链接它们”。在 Node.js 中使用 require 加载的文件存储在内存中,因此您可以对它们做任何您想做的事情,而不会对 运行 应用程序产生任何影响。要为“通过脚本标签链接”的文件实现类似的功能,您需要将它们加载到 Node.js 应用程序的内存中并从那里将它们提供给浏览器,而不是直接从 FS 提供。
    • 又是如何实现的?
    猜你喜欢
    • 2017-12-18
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多