共计 2718 个字符,预计需要花费 7 分钟才能阅读完成。
作为开发人员,常常要提供各种尺寸的图像,以确保不同屏幕尺寸和分辨率的设施都有杰出的拜访体验。这样对于图片的治理就会变得非常复杂。存储在 S3 上的图片常常会被解决成各种尺寸,以适应网站和 APP。
本文将论述一种形式,当设施拜访 S3 上图片的时候,会生成一张适当尺寸的图片返回设施。
理论在 2017 年时,亚马逊云科技公布了一个解决方案——Serverless Image Handler
https://aws.amazon.com/soluti…
这个计划利用 Lambda 和 API Gateway 动静的生成的缩略图。本文所实现的性能与 Serverless Image Handler 完全一致,但本文利用了新公布的 Graviton2 机型,在领有 海量工作负载且变动平缓 的前提下,能够达到对 老本大幅度优化。能够从下表看出 Serverless Image Handler 与 Graviton2 解决缩略图所实用的不同场景:
本解决方案劣势
灵便地解决图片:只需在 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 将文件返回至用户。
部署指南
1. 首先咱们参考这篇 blog:
https://aws.amazon.com/cn/blo…
其中 2.1、2.2 和 2.3,搭建一个基于 Gravition2 EC2 实例的 php 运行环境。如果用于生产,能够搭建一个 Auto Scaling Group,但搭建 ASG 并不是本文重点,所以仅以单台 EC2 实例为例。
2. 将 https://github.com/nwcd-sampl… 文件放入 EC2 实例上的 /usr/share/nginx/html/ 目录,并且设置为默认首页。
3. 创立一个名为 thumber-test 的 S3 存储桶,在“备用域名(CNAMEs)”填入一个二级域名,并且确保子域名与 S3 存储桶名称统一,如:thumber-test.example.com,并上传图片 jpg 至存储桶。
4. 关上 CloudFront 服务,创立一个基于 thumber-test 存储桶的调配。而后点击进入刚创立的调配,抉择“源和源组”,点击“创立源”,在“源域名”中填入新创建的 Gravition2 EC2 实例的域名。
1. 在雷同页面,抉择“源组”中的“创立源组”,顺次增加 S3 存储桶源和 EC2 实例源。并在“故障转移条件”中勾选 404 与 403。
2. 在标签栏抉择“行为”,抉择默认行为,点击“编辑”,在“源或源组”处抉择刚创立的源组 ID,而后保留。
3. 将二级域名 thumber-test.example.com 的 CNAME 指向散发的域名。
4. 此时能够进行验证,在浏览器输出 https:// thumber-test.example.com/test.jpg/thumb_300_300,会返回一张长宽为 300 像素的图片。进入名为 thumber-test 的 S3 存储桶,能够看到多了一个名为“jpg/”的文件夹,外面有一文件名为 thumb_300_300。像素尺寸能够依据需要自在批改。
论断
部署实现后,咱们应用同样大小机型,c6g.large、c5.large、c5a.large,模仿客户生产环境中进行测试,测试数据集由 10% 的 5M 以下,20% 的 20M 以上图,以及 70% 的 5M 到 20M 大小图片组成。通过测试能够失去以下后果(因为可能理论零碎参数、数据集等细节不同,会造成最终测试后果不同,所以隐去了测试后果具体数值):
能够看出,c6g.large 在同样大小的机型中,运行 php 批改图片大小程序性能最好,价格最低。并且 c6g 还有尺寸更小的实例,能够利用 c6g 实例搭建 auto scaling group,其弹性粒度比另外两种实例更佳。
本篇作者
夏焱
亚马逊云科技解决方案架构师
目前专一于容器化解决方案。在退出亚马逊云科技之前,曾就任于惠普、IBM 等科技公司,从事数据中心基础架构相干工作,领有十余年技术服务教训。