【发布时间】:2021-07-30 19:15:15
【问题描述】:
我是 NodeJS 的新手,主要来自 PHP,并且正在构建一个应用程序,该应用程序需要在每次请求时从服务器提供新的 HTML 服务 - Node 使用 EJS 模板引擎提供 HTML - 没有 SPA 框架。由于服务器 I/O 操作,当我不确定 PHP 是最适合还是 Node 时,我偶然发现了一个案例。
我的应用的整个请求过程是完全异步的。所有 DB (Mongo) 调用、readFiles、EJS 渲染和包含等。关键是所有可以异步的代码都是异步的,不会阻塞事件循环和服务器 I/O 操作。
但是,我的应用程序需要提供和呈现大量用户特定的动态数据,并且呈现必须是同步的。该应用程序是一个具有许多页面和选项的客户管理系统,在任何给定的时间点都会同时有几十个登录用户,每个用户都需要与他们相关的数据(因此完全缓存 HTML 并不是真的一个选项)。
例如,如果我从数据库中获取 1,000 个项目的列表,并且需要运行常规 for 循环来呈现它(使用或不使用 EJS)。据我了解,for 循环是完全阻塞的。即使处理 1,000 个项目非常快速和简单,它仍然是阻塞的。如果确实有很多渲染与阻塞服务器的 for 循环等简单逻辑有关,那么这显然是有问题的。
这里有一段代码来说明我在说什么:
const arr = new Array(1000);
let ul = '<ul>';
for(var i = 0; i < arr.length; i++){
ul += `<li>Item #${i}</li>`;
}
ul += '</ul>
res.end(ul);
上面的简单示例,渲染一个简单的 UL,不管它是快是慢(取决于将在数组中的数据),都会为所有用户阻塞整个服务器。
我想这与许多用户同时请求页面的电子商务应用程序相同。这样的应用程序使用 PHP 而不是 Node 会更高效,因为使用 PHP 运行简单的逻辑,不管数据集有多大(大部分),只是不会阻止服务器为其他用户提供服务?或者也许我错过了关于 NodeJS 的一些东西?您将如何在使用 NodeJS 的生产环境中处理这种情况(如果有的话)?
【问题讨论】:
标签: php node.js io event-loop nodejs-server