在节点中生成缩略图并上传到 s3 存储桶的最佳方法是什么?

cod*_*Guy 7 javascript amazon-s3 node.js reactjs aws-lambda

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

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

我还经历了一些像cloudinary这样的东西,这似乎是动态图像转换的好选择。

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

  1. 我应该点击我的应用服务器(NodeJs)来上传/转换图片吗?我问的原因是,我尝试了cloudinary,其中图像上传甚至没有命中应用服务器。

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

  3. 点击应用程序服务器并将图像上传到 s3 存储桶并触发 lambda函数来执行所有转换(有什么好处?)

感谢您耐心阅读这些问题。我愿意接受任何建议、想法和关注。

K M*_* Mo 3

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

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

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

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

您的选择并不是真正的三个不同的选择。

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

选项 2 和 3 涉及您是否将额外工作作为初始上传的一部分并在您的控制下进行,或者单独关注更多基于事件的架构。

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

对图像上传结果采用自动工作流程使云提供商承担一定的复杂性(至少在重试方面)。但您仍然需要正确调整 lambda 大小,以便它及时处理所有事情。

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

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