Serverless(无服务器)应用可以说是当前的行业热点,用户无需预配置或管理服务器,只需要部署功能代码,AWS Lambda会在需要的时候执行代码并自动缩放, 从每天几个请求到每秒数千个请求,轻松地实现FaaS (Function as a Service)。无服务器应用的使用场景非常广阔,从微服务架构,到批处理、流处理、运维自动化和移动计算。
### 实现Serverless应用,除了AWS Lambda还需要什么?
我们来看一个典型的基于Lambda的无服务器应用。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/1-2.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/1-2.png)
当我们将作为计算和存储实体的Lambda函数、消息队列、DB去掉,可以看到下面这张图。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/2-3.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/2-3.png)
这张图上的箭头,就是上一张图里Lambda函数之间的流程,或者可以称为Lambda函数之间的“胶水”,它们起到了编排协调各个Lambda函数的作用。通常在应用中,我们会需要有这样的一些流程:
* 我想要顺序地执行方法。
* 我想要并行地运行这些方法。
* 我想要基于数据选择执行方法。
* 我想要重试某些方法。
* 我想要try/catch/finally。
* 我想要代码运行一定时间或者等待一段时间……
通常我们可以通过方法调用、函数链、DB和消息队列来协调这些函数,实现流程。但是对于所采用的协调机制,我们都希望它具有以下功能:
* 可以自动伸缩;
* 不会丢失状态;
* 可以处理错误和超时;
* 可以简单的搭建和运维;
* 可以审计。
这里我们介绍一种方式,采用AWS Step Functions协调Lambda函数之间的流程。
### AWS Step Functions
AWS Step Functions是一个可视工作流服务,可用来轻松协调分布式应用程序和微服务的各个组件。用户从单个组件构建应用程序,每个组件都执行一个特定的功能,也就是Task(可以采用Lambda函数实现)。Step Functions提供了一种可靠的方法来协调这些组件并逐步完成应用程序中的这些功能,并且 提供了一个图形控制台,将应用程序的组件可视化为一系列步骤,它可以自动触发并跟踪每一个步骤,并在出现错误时重试,这样应用程序就可以每一次都按照预先设定的顺序执行。Step Functions会记录每一步的状态,因此当事情出错时,用户可以快速地诊断和调试问题。
要使用Step Functions构建应用,首先我们需要在Step Functions里创建State Machine(状态机),也就是对应每一个应用的工作流程。可以采用以下8种蓝图,包括7种预定义好的状态机和1种自定义的。创建好的状态机用JSON描述。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/3-3.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/3-3.png)
在每一个状态机里,我们需要定义一系列的State(状态),用来完成不同的功能:
* Task:在状态机中完成特定的功能,可以采用Lambda函数实现。
* Choice:在各种执行分支中进行选择。
* Fail和Success:停止一个执行,并设为Fail或者Success。
* Pass:简单地将输入传给输出,或者注入一些数据。
* Wait:提供一定时间的延迟,或者等待到特定的时间/数据。
* Parallel:并行地执行分支。
可以看出,上一节中我们所需要的协调和流程在这些状态中都得到了支持。其中的Task状态是用来真正实现应用的功能,而其他状态用来处理功能之间的流程。比如说,下面是一个名为HelloWorld,执行Lambda函数的状态。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/4.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/4.png)
下图是一个拥有所有状态的状态机:
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/5-2.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/5-2.png)
在Console里看到一个创建好的状态机是这样:
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/6-1.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/6-1.png)
我们点击New Execution并且传入input数据,就可以启动该状态机的一次执行,并且可以从界面上查看执行的情况。
此外也可以通过AWS SDKs,Step Functions API和AWS CLI来启动状态机的执行并且查看进程。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/7.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/7.png)
### 采用AWS Lambda和AWS Step Functions构建Serverless应用的例子
这里介绍一个镜像识别和后端处理的例子,展示如何使用 AWS Step Functions 编排一个集成 AWS Lambda、Amazon S3、Amazon DynamoDB 和 Amazon Rekognition 的无服务器处理工作流。此工作流处理上传至 Amazon S3 的照片,并从镜像中提取元数据,如地理位置、大小/格式、时间等。然后,它使用镜像识别功能标记照片中的对象,同时还生成照片的缩略图。该例子的源代码在github上:https://github.com/awslabs/lambda-refarch-imagerecognition
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/8-2.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/8-2.png)
整个架构的流程如下:
1. 一张图片上传到名为PhotoRepo的S3 bucket里,位于“Incoming/”前缀下。
2. S3 upload event产生,触发了名为ImageProcStartExecution的Lambda函数,该函数启动了AWS Step Functions中ImageProc状态机的执行,并将S3 bucket和object key作为参数传入状态机。
3. ImageProc状态机执行以下步骤:
4. 从S3中读取文件并抽取出图片的元数据(格式、EXIF数据、大小等等);
5. 基于上一步骤的输出,验证上传的文件格式是否支持(png或者jpg);如果不支持,抛出NotSupportedImageType错误并且结束执行。
6. 将抽取出的元数据保存在ImageMetadata DynamoDB中。
7. 并行地同时启动两个进程:
* 1) 调用Amazon Rekognition探测图像文件的对象,如果探测到,将tag保存到ImageMetadata DynamoDB中;
* 2) 生成缩略图并且保存在名为PhotoRepo的S3 bucket的“Thumbnails/”前缀下面。
可以通过源代码中的test web app上传图片来测试该图像识别和处理工作流的结果。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/9-1.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/9-1.png)
可以通过源代码中的CloudFormation template来创建该后端处理应用程序。
### 结论
用AWS Lambda函数定义应用程序需要执行的每一个特定功能,而用AWS Step Functions定义在各个功能中流转的流程,这样采用AWS Lambda和AWS Step Functions联合使用的方式,可以轻松地构建出Serverless应用。
此外,AWS 还提供一系列完全托管的服务,可以用来构建和运行无服务器应用程序。
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/10.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/10.png)
[](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/11.png)](https://d2908q01vomqb2.awsstatic-china.com/472b07b9fcf2c2451e8781e944bf5f77cd8457c8/2017/09/13/11.png)
### 参考
可以在我们的网站上下载到相关例子的sample code:https://github.com/awslabs/lambda-refarch-imagerecognition
关于AWS Step Functions的 更多内容请参考网站:[](https://amazonaws-china.com/cn/step-functions/)
关于AWS Lambda的更多内容请参考网站:[](https://amazonaws-china.com/lambda/)
关于AWS服务器平台请参考网站:[](https://amazonaws-china.com/cn/serverless/)
本文转载自 AWS 技术博客。
原文链接:
更多内容推荐
【架构训练 Week01 作业】Review
开过中需分、I计架设、细计、编实、试多环,架设”是件发程,个节的环软开过中会及多角,品理U设师架师开工师测工师“构”是中一角,不定个门职,很中规的联公的统发,程员者发程承了构作和职,这序就架师色他一需他认,他做构作输架文,组大评。
2020 年 6 月 10 日
【总结】框架设计之架构师实现自己架构目标的主要手段
以铜为鉴,可正衣寇;以古为鉴,可知兴替;以人为鉴,可明得失。朕尝保此三鉴,内防己过。今魏徵逝,一鉴亡矣。
2020 年 6 月 17 日
ARTS-Week 02
ARTS Week 02
2020 年 6 月 24 日
架构师必读书单 | “华仔,放学别走!” 第 5 期
架构师本身就是一个比较综合的职位,对综合技能要求很高,需要你从各方面提升自己。而读书和技术提升是类似的,都是一个长期积累的过程,积累越多、收获越大。
2018 年 9 月 13 日
LeetCode 题解:50. Pow(x, n),暴力法,JavaScript,详细注释
原题链接:https://leetcode-cn.com/problems/powx-n/
2020 年 10 月 23 日
论十三
外国鬼子也搞封建迷信,以为13是不祥之数!但也有不信邪的愣头青,像巴拉克,非要选13做为球衣号码,结果是终其职业生涯,拿了无数让常人无法企及的亚军,仿佛王皓附休!别人言必称三冠王,他却是妥妥的三亚王
2020 年 5 月 1 日
ML GDE 是 TensorFlow 社区与开发者的桥梁
2019 年 3 月 14 日
leetcode1137:第 N 个泰波那契数
第N个泰波那契数
2020 年 5 月 4 日
多设备管理平台 STF
2019 年 12 月 25 日
(课外辅导)人工神经网络 | 拓展阅读参考书
梳理了人工神经网络模块几本经典的书,为你进一步学习提供参考。
2018 年 1 月 26 日
[ARTS 打卡] week 01
ARTS打卡
2020 年 5 月 31 日
荷之美 | 中国荷苑
荷之美,出淤泥而不染,濯清涟而不妖,中通外直,不蔓不枝,亭亭玉立,可远观而不可近亵焉……
2020 年 9 月 26 日
week04
典的型联应系使了些术案手,要决么题请举述
2020 年 6 月 30 日
第二季回归 | 这次我们来专门聊聊 V8
V8率先采用了即时编译技术,混合了编译执行和解释执行两种方式,大幅优化了JavaScript代码的执行效率。
2020 年 3 月 16 日
是时候要说再见了,春风十里,不如邮你!
"无财作力,少有斗智,既饶争时" --史学大家司马迁 《史记·货殖列传》
2020 年 4 月 22 日
架构师训练营 -- 第二周学习总结
件发历谈,述件发发历,及一段标性件在过中诞了程言使计机解现世的题并于了了程言及程法演方,面过编,向数程到在面对以面连编,过更的近用端更抽效化户的现及用式
2020 年 6 月 14 日
使⽤TensorFlow Serving 部署云端服务
2020 年 8 月 13 日
架构师训练营第 1 周 _ 食堂就餐卡系统设计
课程练习:食堂就餐卡系统设计
2020 年 6 月 10 日
全面了解 CGI、FastCGI、PHP-FPM
全面了解CGI、FastCGI、PHP-FPM
2020 年 8 月 16 日
推荐阅读
2020 年书单
2020 年 12 月 22 日
原创 | 使用 JUnit、AssertJ 和 Mockito 编写单元测试和实践 TDD (十二)编写测试 - 简单测试
2020 年 5 月 30 日
性能设计篇之“边缘计算”
2018 年 5 月 3 日
ARTS 打卡第 4 周
2020 年 7 月 26 日
软件设计原则 - 第三周总结
2020 年 6 月 24 日
网易严选企业级 Node 及 Serverless 应用实践
2019 年 7 月 24 日
每周一起背 10 句 | week 09
2020 年 7 月 11 日
电子书
大厂实战PPT下载
换一换 沈剑 | 快狗打车 CTO
怀宝兴 | 华为云 EI 语音语义团队算法总监
李倩 | KodeRover 创始人
评论