javascript - 生成缩略图并上传到 Node 中的 s3 存储桶的最佳方法是什么?

标签 javascript node.js reactjs amazon-s3 aws-lambda

我正在开发一个示例应用程序,我的后端在 NodeJs 上,前端使用 React。这个应用程序要处理一堆照片, 因此用户可以上传照片,后端会将其保存到 s3 存储桶中。此外,我需要一些转换,例如生成不同大小的缩略图,很可能是两个 100 px * 100px 和 200px * 200px 的缩略图。

话虽如此,处理缩略图生成过程的最佳方法是什么?

我还经历了一些类似 cloudinary 的事情这似乎是动态图像转换的好选择。

现在我有几个与最佳实践相关的问题。

  1. 我应该访问我的应用服务器 (NodeJs) 以进行图像上传/转换吗?我问的原因是,我尝试了 cloudinary图片上传甚至没有到达应用服务器。

  2. 或者点击应用服务器并在那里生成缩略图就可以了 将其上传到 s3。

  3. 点击应用服务器并将图像上传到 s3 存储桶并触发 lambda 函数来完成所有的转换(有什么优势?)

感谢您耐心阅读这些问题。我乐于接受任何建议、想法和疑虑。

最佳答案

这取决于您的要求,但我会尝试找出每种要求的优缺点。

首先,需要考虑一些事情:

  • 要上传多少张图片?
  • 这些图片和缩略图的访问频率是多少?
  • 上传后需要多快可以访问缩略图?尽可能接近即时,还是可以接受几秒钟的延迟?
  • 这些图片有多大?
  • 哪个更重要,运行成本还是开发成本/时间?

您需要了解所有这些内容才能进行有效比较。

您的选项实际上并不是三个不同的选项。

选项 1 是一个独立的架构决策。是否通过应用程序服务器将所有内容或任何内容推回取决于您,前端或后端都有适用于 AWS 和 Cloudinary 的 sdk。但是,如果您将所有内容都放在前端,请注意管理 key 的方式。无论哪种方式都要小心,但通常每个人都可以看到人们忘记的前端代码。

选项 2 和 3 涉及您是将额外工作作为初始上传的一部分并在您的控制之下,还是将关注点与更多基于事件的架构分开。

如果您在应用服务器上完成所有工作,请确保它的大小合适以应对工作负载,并且它可以在出现任何问题时处理重试。这可能是您需要做的最多的工作,并且显然会给您的服务器带来最大的负载。增加服务器的规模可能比使用 lambda 花费更多,除非您的吞吐量非常稳定、非常高并且您可以恰到好处地指定它们。

图像上传结果的自动工作流程使云提供商的责任变得有点复杂(至少在重试方面)。但是您仍然需要正确调整 lambda 大小,以便及时处理所有问题。

这两种情况都有很多代码示例,但 AWS lambda 的代码示例可能更多(警告 - 基于 30 秒的谷歌搜索)。

您实际上并没有将其作为一个选项提出来,但 Cloudinary 会即时进行图像处理(如您在介绍中所述)。这意味着您实际上不需要创建和保存缩略图,只需在 url 中调用具有指定大小的原始图像即可。你能忍受延迟吗?大多数时候几乎认不出来。你能忍受这样的代价吗?无论是金钱还是用完您的免费积分。

关于javascript - 生成缩略图并上传到 Node 中的 s3 存储桶的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54760261/

相关文章:

javascript - 第一次访问后 Pagerjs 没有更新 withOnShow

javascript - 使用 react-native 中的 swipeout 将函数从父容器传递到子容器

javascript - 在网页上水平对齐时钟

javascript - Alexa Just Listen 调用名称然后闪烁并停止?

mongodb - API 错误 : Error: connect ECONNREFUSED 127. 0.0.1:389 Apollo-React MongoDB

javascript - 将 Backbone.js 集合导出到硬盘上的纯文本并导回

javascript - 使用 Node.js 将 HTML 存储在 browserDB 中

node.js - 错误: Cannot query across one-to-many for property TypeORM

javascript - 如何在对象数组中使用 usestate 更新状态?

javascript - React 无状态组件中如何使用 ES6 map 函数