【问题标题】:Do I need to use queue for uploading file to Amazon S3 from my Node.js Server?我是否需要使用队列将文件从我的 Node.js 服务器上传到 Amazon S3?
【发布时间】:2015-07-01 08:12:34
【问题描述】:

这个问题我想了很久。文件上传到 Node.js 服务器不会阻塞它的线程吗?我这里不是指获得单次上传的响应。

例如,假设有 100 个用户将图片(或大文件)上传到服务器。文件上传到我的服务器后,我会将其移动到 Amazon S3。现在,

  1. Node.js 如何处理这 100 个请求?每 100 个并行请求的单独回调?
  2. 我不希望用户等到上传到 S3,一旦文件上传到服务器,应该单独传输到 S3 并立即发送响应。
  3. 在文件传输到 S3 完成之前,是否会回复用户,杀死(上传到 S3)进程
  4. 我应该使用 queue 来处理向 S3 的转移吗?还是不需要?

Note: Don't mark it as duplicate unless you found a SO question with answer to all my questions.

【问题讨论】:

  • 您会在将这些上传的文件发送到 S3 之前对其进行处理吗?
  • 不,我没有处理文件,但是一旦上传到 S3,我应该将其添加到数据库中。
  • @RahatMahbub 我不是 OP,但如果我正在处理文件,那么队列会是最优的吗?这样做的架构是什么?我只能在作业中存储有限的数据,因此缓冲区可能太大。您是否建议流式传输到我的服务器,然后将原始图像流式传输到 S3,然后排队作业以将图像拉回(及其 URL),对其进行处理,然后重新上传处理后的版本?谢谢。

标签: javascript node.js amazon-s3 event-loop


【解决方案1】:

由于您提到您没有在服务器上处理文件,因此您应该直接将文件上传到 S3,而不通过您的服务器。这将是最优化的工作流程。也就是说,user --> S3 而不是 user --> node--> S3

现在针对您的具体问题,文件上传本身不会阻止 Node.js。

所有 I/O 操作都由 Node.js 处理,内部使用多个线程;它是单线程、基于事件和异步的 I/O 功能的编程接口。

更多信息:Will Node.js get blocked when processing large file uploads?

所以,你的问题的答案是:

  1. Node.js 将为这 100 个请求一个一个启动文件上传,并为每个请求生成线程,当每个请求完成后,回调将被放入事件循环队列中。

  2. 如果您不希望用户等待(另外,等待可能会超时)并且如果您想单独传输到 S3,请使用队列。

  3. 取决于您的实现,但不应该使用队列。

  4. 如果你去user -->node-->s3,是的。否则,您的用户很可能会在上传到 S3 完成之前很久就超时。

如果您对文件进行任何类型的处理,您可能应该遵循此队列路线。否则,请使用我原来的建议。如果您需要帮助来实现它,这里有很多可用的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2015-03-06
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多