gpt4 book ai didi

javascript - 实时更新 Node.js 服务器

转载 作者:行者123 更新时间:2023-11-30 08:36:40 26 4
gpt4 key购买 nike

我想设计一个实时更新的 Node.js Express 服务器,也许有一个特定的路由,比如/update,它加载一个新的配置文件。我现在对此唯一担心的是,更新发生时服务器可能处于任何状态。如果我在为用户请求处理 JS 消息时加载新的配置文件,则在用户请求开始时可能有一个配置,并且在请求完成之前可能有第二个配置,当加载新的配置文件时.我能想到的防止这种情况的唯一方法是关闭服务器至少一分钟(保持服务器事件,但完全阻止任何传入请求)然后更新服务器并将其重新联机,但事实并非如此热重载或实时更新的最佳形式是什么?

我怎样才能以某种方式欺骗 JS 事件循环,以便仅在所有请求完成后才加载配置文件,并延迟任何新请求直到配置加载完成?

一种算法是:

  1. 设置一个标志“开始重新配置”
  2. 上面的标志阻止处理任何新请求(使用 Express 中间件)
  3. 检查所有当前请求是否已完成(想不出比这里的轮询循环更好的方法了)
  4. 完成上述检查后,加载新配置
  5. 加载配置后,将标志从 (1) 切换

最佳答案

Disclaimer: I have not tried this in production. In fact, I have not tried this at all. while I believe the idea is sane, there may be hidden pitfalls along the road which are not currently known to me.

许多 Node.js 开发人员往往忘记/没有完全意识到一件事:

一次只能执行一个 JavaScript 语句。

您可以执行异步 I/O 或稍后及时执行函数并不重要。不管你怎么努力,你写的所有 JS 代码都是在一个线程中执行的,没有并行性。只有底层实现(完全不受我们控制)才能并行执行操作。

这对我们有帮助,因为只要我们的更新过程是同步的,就不能执行其他 JS 代码(即客户端响应)。

配置实时补丁

防止在请求中更改配置的解决方案非常简单:

每个请求都会获得自己的应用程序配置副本。

如果您的应用程序配置存在于 JavaScript 对象中,您只需为每个新请求克隆该对象即可。这意味着即使您突然更改配置,它也只会应用于新的传入请求。

There are tons of modules for cloning (even deep cloning) objects, but since I believe mine is best I will use this opportunity for some small self-promotion - semantic-merge.

代码实时补丁

这有点棘手,但通常只要付出足够的努力就可以实现。

这里的技巧是先remove/unregister current Express routes , 清除 Node's require cache , require 再次更新文件并重新注册路由处理程序。现在 Express 将使用旧代码完成所有未决请求(这是因为只要代码包含事件对象引用,Node 就无法从内存中删除这些旧函数 - 它确实如此 - reqres ) 并将新需要的模块/路由用于新的传入请求。一旦不再有以旧代码开始的请求,旧代码就应该从内存中释放。

在请求处理过程中,您不得在任何地方使用require否则您可能会遇到与在请求中更改配置相同的问题。您当然可以在模块级范围内使用 require,因为它将在需要模块本身时执行,因此是同步的。

例子:

// app/routes/users.js (or something)

// This is okay, because it is executed only once - when users.js
// itself is required
var path = require('path')

// This function is something you would put into app.use()
module.exports = function usersRoute (req, res, next) {
// Do not use require() here! It will be executed per-request!
}

关于javascript - 实时更新 Node.js 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30786875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com