节点.js:为HTTP代理选择正确的架构,为每个用户下载许多文件,并将结果作为存档返回

Node.js: Choose right architecture for HTTP-proxy to download many files to each user and return result as archive

本文关键字:文件 许多 下载 用户 结果 返回 选择 代理 HTTP js 节点      更新时间:2023-09-26

这更像是架构问题。我需要有人指出我以哪种方式构建流程以实现最佳性能。我是 Node 的新手,所以你需要为我咀嚼答案:)

我想要:Node.js HTTP代理。该代理为我的用户下载文件。

输入数据:

  1. 我们同时有 10 个用户
  2. 每个用户要求我们下载 100 个文件(单个请求(
  3. 每个文件大约是20Mb,并以块的形式提供给我们。

我想要:

  1. 下载文件并将其发送给用户
  2. 我想将它们与 Zlib 粘在一起(这意味着实际上我不想压缩它们,我只想让用户获得单个下载结果而不是他的下载文件夹中的 100 个文件(
  3. 而且我不想在服务器端缓存结果(这意味着我想即时粘贴 gzip 结果并发送给用户。否则我会在服务器上遇到内存问题(。

架构问题: 如何构建流程? 或者如果准确地说:

  1. 单个事件循环中完成整个工作,每个任务在单独的工作线程中还是介于两者之间?
  2. 我应该将 gzip 任务移动到单独的工作人员吗?如果是,是每个用户单独的工作线程还是只是一个普通的 gzip 工作线程?
  3. 我应该 gzip 并发送给用户什么:文件块、文件或文件集?
  4. 同步下载/gziping怎么样?意味着我应该和不应该同时做什么?

附言几乎很多问题,但它们都是关于我需要解决的单一任务。您可以回答所有这些问题或只回答一个 - 任何帮助将不胜感激!

好的。如果浏览器请求文件,在这种情况下,您不能只将 100 个文件写入文件夹,因为您无法控制用户的计算机。您唯一能做的就是将一个文件返回给用户,以便响应用户请求。在这种情况下,您唯一能做的就是在服务器端连接文件。但遗憾的是,您也无法立即下载 2Gb 的数据,因此此处的适当算法可以是:
1. 用户文件
请求2.服务器开始逐个或分组并行下载它们,并从外部资源接收数据。服务器为此使用读取流 (http://nodejs.org/api/stream.html(。
3. 服务器打开写入流进行响应。
4.对于每个接收的数据块,服务器标记它属于哪个文件,打包它,并将其发送到可写流中给用户。

注意:生成的文件将是 100 个不同文件的混合块的混乱。客户将需要一些东西来解压缩它。不知不觉地,您可以尝试使用一些打包程序(如gz,zip或tar服务器端(来发送一些对用户有意义的文件(通过一些现有的算法打包不同的文件块并作为流发送给用户(。

一般来说,我建议2Gb很难以任何方式作为单个文件发送。在这种情况下,可以编写客户端应用来执行此操作。https://github.com/rogerwang/node-webkit 模块可以帮助您编写客户端应用程序。

注2:此外,设计集群和请求处理以使用域以避免整个应用程序崩溃也非常重要。因为在节点中很难(有时是不可能的(.js捕获流中引发的错误(根据我的经验,这种情况经常发生(。有关详细信息,请阅读 http://nodejs.org/api/domain.html。