使用node.js替换Nginx导入大文件?

4
我已经找到了一个关于大文件事件循环的Stack Overflow帖子,但它主要是关于下载。我从那篇文章中得出的结论是,对于下载而言,node.js可能已经足够了,但Nginx是一个经过实战考验的解决方案,非常稳定。
但是上传呢?我们需要上传巨大的文件。我们从事基因组学研究,人类基因组数据集的大小可达200GB。据我所知,Nginx始终会在将请求(包括头部和正文)转发给后端之前缓存完整个请求。当同时处理三个上传请求时,我们的内存就不够用了。
我们的应用程序中有一堆小型的“只做一件事并且做好”的服务器,其中之一负责上传(并将其转换为内部格式)基因组数据,另一个则提供socket.io处理,以便客户了解上传进度和其他应用程序生态系统中正在进行的事件。其他服务器则处理身份验证、客户数据处理和媒体服务等任务。
如果我正确地阅读了node.js的http/https模块代码,那么node.js是处理这些问题的理想工具:它本地支持HTTP/1.1,因此WebSockets通过将起作用,并且在处理HTTP HEAD后,它将(request, response)元组传递给处理程序函数,但在绑定request.on('data', ...)事件以排空BODY缓冲区之前,会暂停BODY的处理。
我们的服务具有基于URL的良好分段命名空间:"/import"、"/events"、"/users"、"/api"、"/media"等。Nginx只能正确处理最后三个。用node.js应用程序来处理它们所有是否难以或不合适?或者是否已经存在一些模糊的反向代理(Nginx、Pound和Varnish都具有类似的限制),可以满足我所有的要求?
2个回答

3
如其他答案所述,formidable是一个非常可靠的用于处理上传的库。默认情况下,它会缓存到磁盘,但如果需要,您可以覆盖该行为并在数据到达时处理数据。因此,如果您想编写自己的代理,node.js + formidable是将上传作为流传输的绝佳方式。
您还可以尝试node-http-proxy,但不幸的是,我不确定它如何进行缓冲。您还应考虑到它没有像Nginx那样被广泛使用,因此我不确定我会有多少信任直接将其暴露给公众(这不是针对库本身的问题,而是与Node有关)。
您是否看过Nginx的client_body_buffer_size指令?设置为较低的值似乎可以解决您的内存问题。

1
client_body_buffer_size决定了当客户端请求超过给定大小时会发生什么,但它不是一种流式解决方案。 - Elf Sternberg
最终,我选择了 node-http-proxy,并且编写了自己的转接板 - Elf Sternberg

1

我不确定你在问什么(没有简短的总结!),但你可以看看这些模块:formalineformidable,它们都经过了实战考验,成熟且快速,可以将文件写入tmp文件夹,不容易导致内存耗尽。在内存管理方面,v8垃圾回收器是最好的。

至于http代理,同样有一个模块node-http-proxy,也经过了实战考验,在开发中使用。我相信他们制作它的目的是为了确保人们没有理由使用Nginx作为反向代理。

关于扩展你的应用程序,并在多台机器上使用多个进程,我建议使用hook.io。使用hook.io,你可以为应用程序的每个部分创建进程,并通过发出事件和其他人监听来相互通信。它还不完全稳定,但足以开始进行开发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接