发布于: Oct 14, 2022

利用弹性云计算模式可以解决灵活性较高的问题,比如,作为开发人员,经常要提供各种尺寸的图像,以确保不同屏幕尺寸和分辨率的设备都有出色的访问体验。这样对于图片的管理就会变得非常复杂。存储在 S3 上的图片经常会被处理成各种尺寸,以适应网站和 APP。本文将阐述一种方式,当设备访问 S3 上图片的时候,会生成一张适当尺寸的图片返回设备。

实际在 2017 年时,Amazon Web Services 发布了一个解决方案 Serverless Image Handler,这个方案利用 lambda 和 API Gateway 动态的生成的缩略图。本文所实现的功能与 Serverless Image Handler 完全一致,但本文利用了新发布的 Graviton2 机型,在拥有海量工作负载且变化平缓的前提下,可以达到对成本大幅度优化。可以从下表看出 Serverless Image Handler 与 Graviton2 处理缩略图所适用的不同场景:

 

Serverless Image Handler

Graviton2

工作负载变化

峰值和低谷相差大,变化不线性

负载相对稳定

处理图片文件大小

图片文件大小在一个范围内

图片文件大小相差大

编程语言支持

Nodejs,python等动态语言最佳

对编程语言几乎无限制

灵活的处理图片:只需在 URL 中添加需要生成的图片尺寸,即可动态生成,并且借助 Graviton2 升级的浮点运算性能,可以更加快速的对图片进行处理。

优化成本:仅当一张图片需要改变其尺寸时,才会触发并快速生成。这样可以尽可能的节约存储空间。并且利用 Graviton2 处理图片,比相同规格的 Intel 芯片 EC2 实例便宜 20%。

高可靠性:本方案利用了 CloudFront 的 Origin Group 功能,确保了访问 S3 对象不会出现 404 的情况。并且利用 Auto Scaling Group,使处理图片的 Graviton2 EC2 实例也保持高可靠性。

如果用户通过 APP 访问一张原始图片,会先请求这张原始的图片的缩略图,这样可以更快加载图片。这个请求被转发至 CloudFront。CloudFront 有 Origin Group 的功能,这个功能可以让一个 CloudFront 分发有两个源站,如果第一个源站返回 400 或 500,CloudFront 分发会把请求转发给设定的第二个源站。利用 CloudFront 的 Origin Group 功能,我们让 S3 存储桶成为第一个源站,当请求的缩略图没有找到,CloudFront 会把请求转发给我们设置的第二个源站:一个 Auto Scaling Group Gravition2 集群,这个集群会提取 URL 中信息,URL 里提供的 bucket 名称和原始图片名称以及需要修改成的长宽,从 S3 存储桶找到原始图片,然后把缩图略返回并且保存回 S3 存储桶。

  1. 用户请求原始图片 thumber-test.example.com/test.jpg 的 300 像素乘以 300 像素缩图略,这个缩略图的 URL为thumber-test.example.com/test.jpg/thumb_300_300.jpg
  2. 通过 CloudFront 分发的 Origin Group,将请求转发至第一个源站 S3 存储桶。
  3. 如果缩略图 S3:// thumber-test/test.jpg/thumb_300_300.jpg 存在,则直接返回,整个流程结束。如果缩略图不存在,则 S3 存储桶返回 400。
  4. 由于 S3 存储桶返回的是 400,根据 CloudFront Origin Group 的设定,将请求转发给第二个源站:一个 Auto Scaling Group Gravition2 集群。
  5. Gravition2 集群上的应用程序对请求 URL 进行分析,提取原始图片名称 jpg,以及缩略图尺寸 300 X 300。从 S3 存储桶下载原始图片 S3://thumber-test/test.jpg,并对其进行尺寸修改。
  6. 程序在名为 thumber-test 的 S3 存储桶中创建文件夹:“jpg/”,将缩略图 thumb_300_300.jpg 上传至其中。
  7. 同时也返回给 CloudFront 缩略图文件。
  8. CloudFront 将文件返回至用户。

相关文章