在MEAN Stack应用程序中处理大媒体文件的最佳方式是什么



我有一个MEAN Stack应用程序,我将媒体文件存储在AWS S3 Bucket中。目前,我处理媒体文件上传,方法是在base64中对文件进行编码,并通过node.js后端向S3 Bucked发送每个文件的简单post请求,然后在ward之后返回文件的引用链接。

这在一段时间内效果很好,但现在一些用户决定上传更大的文件,该方超过了通话后的大小上限(我认为每次通话的大小是100 MB,所以我将其限制为95 MB+5 MB的河豚来获取元信息(。

这显然超出了应用程序的技术能力,但对于小于该大小的媒体文件,上传需要很长时间,并且用户没有关于上传进度的反馈。

  1. 在MEAN+S3堆栈中处理大文件的最佳方式是什么
  2. 你建议使用哪些角边库?可能用于视频文件压缩/类型转换(.mov是问题的一部分(,但也用于用户反馈
  3. 通过Node.js服务器放置数据流有意义吗
  4. 您将如何处理RAM上限?(当前每个承载节点服务器的VM(EC2(512mb(
  5. 或者你还建议其他什么解决方案

小前言:如果你还不知道AWS请求签名是什么,请阅读它。这允许你的后端对AWS请求的参数进行哈希签名,以便前端可以安全地调用它们。实际上,您应该将其用于现有的GetObject请求,以便控制、跟踪和过期访问。

  1. 在MEAN+S3堆栈中处理大文件的最佳方式是什么

通过直接从客户端上传,或作为到AWS S3的多部分上传流式传输到服务器。请注意,通过客户端执行此操作需要一些工作,因为您必须调用CreateMultipartUpload协调服务器上多个UploadPart请求的签名,然后调用CompleteMultipartUpload。

多部分上传限制是巨大的,可以通过您选择的块大小来处理任何规模。

在NodeJS中,这实际上比处理每个命令要容易得多。请参阅@aws-sdk/lib-storage包,它将上载封装在处理错误和重试的事务中。

  1. 您建议使用哪些角边库?可能用于视频文件压缩/类型转换(.mov是问题的一部分(,但也用于用户反馈

我对angular不太了解,但我建议不要在前端处理对象。在没有专用服务器的情况下,实现这一点的一个很好的(而且可能很便宜(方法是通过在对象上传时触发的AWS lambda函数。请在此处查看有关lambda调用的更多信息。

  1. 通过Node.js服务器放置数据流有意义吗

正如我在问题1的答案中提到的那样,这对我来说是正确的,但这不是唯一的方法。Lambda函数也是一种合适的替代方法,或者请求预签名。请在此处查看有关该问题的AWS博客。

此外,似乎还有一种方法可以直接从前端发布,并通过S3策略控制访问。

  1. 您将如何处理RAM上限?(当前每个承载节点服务器的VM(EC2(512mb(

与所有性能问题一样,答案是度量。在生产和测试中监控服务器的使用情况。此外,在重要的体系结构上运行压力测试总是很好的。在模拟最坏情况下的高容量使用时,对您的体系结构(在开发部署中复制(进行锤击。

在您的情况下,最有益的可能是不运行服务器,而是运行具有自动缩放和负载平衡功能的服务器集群。此外,容器化可以帮助物理服务器部署和应用程序解耦。容器也可以使用AWS Fargate,这是一种无服务器的容器体系结构。容器还意味着内存扩展可以在进程中进行,而无需进行太多配置更改。

重点回答:就您的目的而言,Fargate或Lambda似乎适合提供无服务器架构。

5或者你还建议其他什么解决方案?

请参阅以上答案。

最新更新