Node.js 不是文件上传(以及所有基于事件循环的语言)的好选择 - 这是真的

Node.js is not a good option for file uploads (and all event-loop based languages) - is that true?

本文关键字:语言 循环 事件 真的 选择 文件 js Node 于事件      更新时间:2023-09-26

据说使用 Node.js 不建议上传文件,因为它会阻塞 IO 循环直到完成,所以我尝试流式上传许多并发文件,我发现 Sails.js(围绕 express 和 node 的包装器)从第一个、第二个、第三个上传块......到 N 个上传器,然后再次回到第一个上传者以循环方式获取下一个块,结果是:所有文件上传几乎同时完成,其方式类似于上传一个大文件,其大小等于并发上传文件的总大小。

我最终得出的结论是,高命中率的文件上传系统不应由采用 IO 事件循环技术的语言设计,而是每个连接的上传客户端应在服务器上有自己的线程,以实现不同上传之间的适当分离以及服务器内存大小和客户端数量之间的衬垫关系。

我在这里得出了正确的结论,还是误解了什么?

你的结论是

每个连接的上传客户端在服务器上都有自己的线程,以实现不同上传之间的适当分离

这是不正确的,因为进程中的每个线程都会消耗资源进行内存管理、线程切换等。因此,在具有无限线程的线程环境中构建命中率文件上传将无法扩展。在 node 中使用基于流的上传解决方案时.js与其他语言/平台相比,应用程序的内存占用和性能应该非常有竞争力。

你的结论与事实相去甚远。基于事件循环的并发对于文件上传等 I/O 任务(也同时发生)非常有效。事件循环仅在代码运行时被阻止 - 事件回调,如连接就绪,更多数据可用等。在你的代码中,你只是做一些非常快速的事情,比如说你想用数据做什么,它应该去哪里等。填充缓冲区和 I/O 传输由操作系统内核处理。在现代计算机上,您可以执行类似 60000 (+/- 50000) 并发传输的操作,同时保持代码正常运行。