在NodeJS服务器之间发送文件的最有效方法是什么?

时间:2016-09-05 18:02:35

标签: node.js express file-transfer

简介

假设在同一个本地网络上,我们有两台Node JS服务器设置为Express:服务器A用于API,服务器F用于表单。

  • 服务器A是一个API服务器,它接收请求并将其保存到MongoDB数据库(文件存储为缓冲区,其详细信息存储为其他字段)
  • 服务器F提供表单,处理表单发布并将表单的数据发送到服务器A.

在接收服务器是Express API的两个NodeJS服务器之间发送文件的最有效方法是什么?文件大小在哪里重要?

1。 HTTP方式

如果我发送的文件是PDF文件(不超过50mb),通过HTTP将整个内容作为字符串发送是否有效?

算法如下:

在此算法中,服务器A(当存储到MongoDB中时)和服务器F(当它发送到服务器A时)都已将文件读入内存,并且两个服务器之间的请求大小相同作为文件。 (50Mb请求好吗?)

然而,有一点需要考虑的是 - 使用这种方法 - 我会在整个过程中使用ExpressJS样式的API,它将与应用程序的其余部分保持一致/list,{{ 1}}请求也在路由中定义。我喜欢一致性。

2。 Socket.IO Way

与此算法相比,我探索了https://github.com/nkzawa/socket.io-stream方式,它脱离了服务器A上HTTP API的一致性(因为socket.io事件的处理程序不在路由中定义,而是在文件中定义有/details)。

服务器F在var server = http.createServer(app);

中处理表单数据
routes/some_route.js

我说我要处理的PDF文件是< 50MB。但是,如果我以后使用这个程序发送更大的文件,socket.io是否可以更好地处理1GB文件,因为它正在使用流?

此方法会发送文件和详细信息,但我是这个库的新手,不知道是否应该将其用于此目的,或者是否有更好的方法来使用它。

最后的想法

我应该探索哪些替代方法?

  • 我是否应该通过SCP发送文件,并发出包含文件详细信息的HTTP请求,包括我发送的位置,从而分离文件协议和API请求?
  • 我是否应该始终使用流,因为它们不会将整个文件存储到内存中? (这就是他们的工作方式,对吗?)
  • https://github.com/liamks/Delivery.js

参考文献:

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但没有那么多做正确!

套接字io和wesockets在浏览器中使用时非常有效,但是由于你没有,所以不需要它。

你可以尝试的第一种方法是使用nodejs的内置网络模块,基本上它会在服务器之间建立一个tcp连接并传递数据。

您还应该记住,您需要发送数据块而不是整个文件,网络模块的socket.write方法似乎非常适合您的情况检查它:https://nodejs.org/api/net.html

但是根据文件大小和并发性,内存消耗可能非常大。

如果你在两台服务器上运行linux,你甚至可以使用一个名为scp的简单linux命令将文件发送到零开始

nohup scp -rpC /var/www/httpdocs/* remote_user@remote_domain.com:/var/www/httpdocs &

你甚至可以使用windows到linux或其他方式。

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Windows的客户端scp是pscp.exe

希望这有帮助!