Node.js 是否适合构建大型文件共享 Web 应用程序?

Is Node.js appropriate for building a large file sharing web app?

我是一名初级程序员,我正在 Node.js 参加在线课程,讲师说不要使用 Node.js 来构建 CPU 密集型应用程序。我不知道什么是 CPU-intensive。我正计划构建一个大型文件共享 Web 应用程序,但我不知道 Node.js 是否是完成工作的正确工具。

Node.js 具有事件驱动架构,这意味着它具有内置 event loop 和异步 I/O API.

CPU 密集型任务是指需要大量 CPU 计算才能完成的任务,例如寻找素数、排序字符串等。

当 CPU 密集型任务在 Node.js 中发生时,它将阻塞事件循环直到完成。在此期间,程序将无法处理新收到的消息。

相反,I/O 操作不需要那么多 CPU 用法。

由于一般来说网络应用程序和文件共享涉及的 I/O 操作多于 CPU 密集型任务(例如从磁盘读取文件并通过网络套接字发送其内容),Node.js 非常适合创建大型文件共享网络应用程序。

Is Node.js appropriate for building a large file sharing web app?

是的。

现代 node.js 如今有多种方法来处理 CPU 密集型任务,因此建议可能有点过时了。该建议来自这样一个事实,即它 运行 在单个线程中是您的主要 Javascript 并依赖于异步 I/O 以允许单个线程使用异步 [=] 非常有效地处理大量请求39=].

但是,如果您的一些请求处理程序使用了很多 CPU 周期,那么它就会使事件循环陷入困境。

但是,现代 node.js 有能力:

  1. 使用内置 cluster module 对其进行集群,因此您有多个 node.js 进程以负载平衡的方式接收请求,这将涉及许多 CPU。

  2. 使用 Worker Threads 启动单独的线程,您可以在其中执行 运行 CPU 密集任务而不阻塞主事件循环。

  3. 创建某种工作队列,您可以在其中使用其他进程或工作线程来 CPU c运行ch 处理排队的工作。我可以想象图像处理应用程序是这样处理的。

在你的情况下,文件共享应用程序可能甚至不涉及很多 CPU 密集的东西,因为很可能是关于谁可以访问非 CPU 密集的东西的主要逻辑和行为为共享资源提供服务完全是 I/O 绑定的(node.js 非常有效)。如果在您开始开发后发现某处存在 CPU 密集型瓶颈,您可以使用上述方法之一轻松解决它。

而且,有很多方法可以通过在单个服务器或多个服务器集群上进行集群来水平扩展 node.js。如果您的应用程序因为所有共享内容而受到 I/O 限制,那么您的缩放可能主要是关于网络带宽和磁盘 I/O 缩放,而不是关于实际的应用程序逻辑或 CPU.