摘要:用华为云函数工作流FunctionGraph搭建图片压缩应用。
本文分享自华为云社区《真正的按需计费丨函数工作流 FunctionGraph实战,5分钟搭建图片压缩应用》,作者:华为云PaaS服务小智。
1.背景介绍
互联网时代,各类app,小程序为人们的生活,办公,学习,休闲,娱乐提供着便利,在今年8月31日中国互联网络信息中心发布的第50次《中国互联网络发展状况统计报告》中显示,截至2022年6月我国网民规模为10.51亿,网民人均每周上网时长为29.5个小时。由此可见互联网市场的巨大。
软件应用提供商不断推出各种满足人们需求的应用,以抢占市场先机,时有大火的应用进入人们的新宠,不知哪一个将成为下一匹杀出的黑马。而对于一个“合格”的应用来说,稳定性和可用性是需要达到的最基础的要求。对于部署在服务器上的应用,如何正常运行以为客户提供稳定的服务,近些年出现诸如负载均衡,微服务等计算机技术,这些技术对于访问量比较稳定或者浮动范围不是特别大的应用来说能够达到很好的效果。但是有些业务场景,应用的访问量并不能如愿的维持稳定,比如说电商网站在促销活动期间的访问量可能是平时的10倍甚至几十倍,上百倍。如果为了应对短期的井喷式访问而增加应用服务部署的服务器数量,是一种不会出错的解决办法,但对于大部分时间都处于正常访问量而少部分时间是激增访问量的应用来说,这种做法无疑是一种浪费,对于应用提供商也是不小的成本投入。另外,对于井喷式访问量的估算也是一项比较难以保证效果的工作,估算超过实际访问量是一种资源的浪费(提前按估算量准备的服务器,以及部署和运维应用的工作投入),估算少于实际访问又会导致服务器超负荷运行,应用响应延时,甚至宕机,从而影响客户的使用感受。
那么有没有一种服务能否实现让软件应用运行所需的资源,像用水用电一样按需使用,按需付费呢?这样,软件应用提供商不用再为正常访问量时闲置的服务器买单,又会在访问量爆发性增长时轻松应对。
2.函数工作流 FunctionGraph
函数工作流(FunctionGraph)是一项基于事件驱动的函数托管计算服务。通过函数工作流,只需编写业务函数代码并设置运行的条件,无需配置和管理服务器等基础设施,函数以弹性、免运维、高可靠的方式运行。此外,按函数实际执行资源计费,不执行不产生费用。
FunctionGraph具有以下优势:
• 无服务器管理
自动运行用户代码,用户无需配置或管理服务器,专注于业务创新。
• 高弹性
根据请求的并发数量自动调度资源运行函数,实现透明、准确和实时的伸缩,应付业务峰值的访问。
用户无需关心峰值和空闲时段的资源需要申请多少资源,系统根据请求的数量自动扩容/缩容。自动负载均衡将请求分发到函数运行实例。
• 事件触发
通过事件触发机制,集成多种云服务(SMN,OBS…),满足不同场景需求,获得高效的开发体验。
与云日志服务、云监控服务对接,无需任何配置,即可查询函数日志和监控告警信息,快速排查故障。
• 高可用
函数运行实例出现异常,系统会启动新的实例处理后续的请求,故障函数实例占用资源将会回收使用。
• 按量计费
根据代码的调用次数和运行时长计费,代码未运行时不产生费用。
3.构建无服务图片压缩应用
为方便读者更近一步了解函数工作流 FunctionGraph,这里提供一个通过函数工作流快速构建图片压缩应用的实操体验 ,帮您快速掌握FunctionGraph的使用,并对所涉及的配置功能有清晰认识。
架构图说明:
• 在OBS服务中,创建两个桶。
• 创建函数,设置OBS触发器。
• 用户向其中一个桶上传图片。
• 触发函数执行,对图片进行压缩处理。
• 函数将处理后的图片上传到指定桶中。
3.1 准备工作
1. 创建OBS桶
创建两个OBS桶,登录对象存储服务控制台 ,按下图创建桶,“your-bucket-input”用于上传需要处理的图像,“your-bucket-output”用于存储处理后的图像。
2. 创建委托
由于华为云各服务之间存在业务交互关系,一些云服务需要与其他云服务协同工作,需要您创建云服务委托,将操作权限委托给该服务,让该服务以您的身份使用其他云服务,代替您进行一些资源运维工作。
本实践中,在创建函数前,您需要为函数设置拥有OBS访问权限的委托,登录统一身份认证服务控制台 ,按下图创建委托(至少拥有对象存储服务的权限:OBS Administrator)。
3.2 构建程序
本例提供了实现图片压缩功能的程序包,用户可以下载详情请参照示例代码 、学习使用。
创建函数
登录函数工作流控制台 ,创建函数,函数名称自定义,委托选择创建委托 中创建的委托,运行时选择“Python3.6”。
输入代码
下载示例代码,粘贴至函数的index.py文件中,如图所示。
添加依赖包
为函数添加pillow-7.1.2 依赖包,pillow-7.1.2 依赖包是Python图像处理库,支持多种文件格式,并提供了强大的图像处理和图形处理能力。
配置函数
• 常规设置
内存选择:“256”
超时时间输入:“40”
• 环境变量
键obs_output_bucket: index.py文件中定义的存放输出图片的OBS桶参数,值your-bucket-output: 创建 OBS 桶 中创建的存放输出图片的OBS桶;
键obs_server: index.py文件中定义的存放输出图片的OBS桶的地址参数,值obs.region.myhuaweicloud.com。
3.3 添加事件源
OBS桶及函数创建以后,可以为函数添加事件源,添加OBS事件源是通过创建OBS触发器实现的。当用户将一张照片上传到存储桶时,OBS存储桶调用FunctionGraph函数,实现读取图像和创建照片缩略图。OBS对象操作触发函数的过程请参考使用OBS触发器 。
如下图所示,桶选择创建 OBS 桶 中创建的“your-bucket-input”桶。事件选择“Post”、“Put”。
3.4 图片处理
当图片上传或更新至your-bucket-input桶时,会生成事件,触发函数运行,将上传图片压缩,保存在your-bucket-output中。
上传图片生成事件
登录对象存储服务控制台 ,进入your-bucket-input桶对象界面,上传image.jpg图片,如下图所示。
可以看到原始图片image.jpg大小超过28KB。
触发函数执行
上传图片至your-bucket-input桶,OBS生成事件触发函数运行,将图片压缩,压缩后的图片存放在your-bucket-output桶中。可以在函数详情页日志页签查看函数运行日志,如下图所示。
图片压缩验证
进入your-bucket-output桶对象界面,可以看到压缩后的图片image-thumbnail.jpg,图片大小小于8KB,实现了对图片的压缩,如下图所示。
4.总结
通过上面端到端构建一个完整的图片压缩应用,我们可以发现FunctionGraph的架构具有如下优点:
1.无需关注任何服务器,只需关注核心业务逻辑,5分钟快速构建后端系统并上线,极大地提高了开发效率。
2.函数运行随业务量弹性伸缩,按需付费,当创建的函数没有执行时,不计费。
3.可以通过简单的配置连通函数工作流和其它云服务,甚至云服务和云服务,比如本例中只需创建一个OBS触发器便可完成OBS和函数工作流的连接,然后在函数中对图片进行压缩,那么函数就像一个粘合剂一样将两个云服务连接在一起。