FaaS分析之 FaaS介绍


【编者的话】FaaS是一种更细分的服务化形态,在云计算、边缘计算和IoT都将会体现其重要的能力。本文介绍FaaS的理论和历史,并且通过AWS Lambda帮助读者更加理解FaaS的使用场景。

FaaS介绍

云计算技术的核心是服务化,服务化就需要提供闭环和灵活的服务。而云计算也在持续发展中,从最初的基础设施服务化(IaaS),平台服务化(PaaS),软件服务化(SaaS),陆续演化出数据库服务化(DBaaS),容器服务化(CaaS)。其实一个更细分的服务化叫做FaaS,FaaS是Functions as a Service的缩写,可以广义的理解为功能服务化,也可以解释为函数服务化。使用FaaS只需要关注业务代码逻辑,无需关注服务器资源,所以FaaS也跟开发者无需关注服务器Serverless密切相关。可以说FaaS提供了一个更加细分和抽象的服务化能力。

FaaS和PaaS的关系

要理解FaaS,就必须了解FaaS和PaaS的关系(关于PaaS的前世今生可以参考笔者的另一篇博客http://dockone.io/article/635)。
在早期的PaaS的技术实现中,比如GAE、SAE,因为当时还没有像Docker容器这样的沙盒打包能力,PaaS往往会提供各种语言技术栈,比如Java\PHP等,而开发者通过上传的代码的方式进行部署,PaaS会负责代码构建和服务的生命周期管理。进一步的,PaaS开始允许开发者自定义开发和构建环境,比如像Heroku和CloudFoundry的Buildpack就是定义了代码的构建和运行逻辑,Buildpack实现了三步功能:
  • detect:检查当前代码是否能支持,比tomcat buildpack发现WEB-INF路径就认为自己能够运行它。
  • compile:将代码进行编译构建,比如将java代码构建成jar包。
  • release:将应用程序启动,比如运行tomcat的startup.sh。



buildpack的详细说明可以参考https://docs.cloudfoundry.org/buildpacks/
实际上BuildPack还是比较难解决代码依赖的问题,而Docker的容器一致性环境和Dockerfile组成完成了强大的沙盒打包能力,为此PaaS平台纷纷支持Docker容器来解决代码构建,像 Kubernete就可以专注于容器编排和服务生命周期管理,而不用像CloudFoundry那样要在内部流程和组件提供代码构建能力,所以Kubernete也被称为CaaS,因为只关注容器的服务化管理,代码的构建由Docker或者上层Devops平台负责。

所以可以说一开始FaaS是和PaaS融合在一起的,而现在PaaS就更加专注于服务编排和资源管理,而FaaS也开始独立出来,FaaS逐渐形成以代码函数为主体的事件驱动架构,使用FaaS的时候可以将函数作为一个线上服务、远程计算服务,可以通过 API 执行、通过邮件执行、通过 Iot 执行,通过队列执行。
云计算服务提供商也纷纷提出FaaS,比如AWS Lambda,Google Cloud Functions以及Azure Functions,然后也有更多的FaaS开源框架推出。接下来我们通过介绍AWS Lambda让读者更加清楚FaaS的业务形态和使用场景。

AWS Lambda

Lambda是AWS 2014年推出的计算服务。Lambda是一种FaaS,所以Lambda服务的核心概念是Lambda function(简称function,函数)。围绕function可以定义情景,包括执行环境(语言、内存、超时、 IAM角色)以及这个function要触发的另一个function。
function上传之后,开发者可以将其指定到指定的AWS资源(如某个S3 bucket,某个DynamoDB表,某个Kinesis流),然后Lambda就会建立该资源跟你的function之间的关联。当资源方面发生变动,Lambda就会去创建资源去执行你的function。用于运行function的资源的创建分配和释放都有Lambda自动来做,开发者完全 不需要去干预。
Lambda是一个事件驱动架构,应用由函数(functions,即业务逻辑的载体)+ 数据(data,即跟业务相关的输入与输出),以及这两者之间的交互——即事件(events。常见的事件如增加、变更、删除等)组成。所以Lambda可以无缝地和其他服务集成,如下:

QQ截图20180511113251.png


场景1:Amazon S3 +Lambda 进行图片处理

QQ截图20180511113125.png


假设有一个照片共享应用程序。用户在应用程序上传照片,应用程序将这些用户照片存储到 Amazon S3 存中。然后应用程序针对上传的图片进行处理,包括图片压缩、加水印等等,在这种场景下,通过 Lambda 配合S3,Amazon S3 是Lambda支持的 AWS 事件源之一,可以发布对象创建的事件 并调用您的 Lambda 函数。 Lambda 函数代码可以从 S3 存储桶读取照片对象、进行图片处理,然后将其保存到S3 。

场景2:Amazon APIGateway+ Lambda实现API调用

QQ截图20180511113202.png


通过 Amazon API Gateway,可以根据在 AWS Lambda 中运行的代码快速、轻松地创建自定义 API,然后通过 API 调用EC2或者 Lambda。Lambda相比EC2来说是一个即开即用的函数,在没有调用的时候是不会运行和计费的,并且AWS可以根据请求的大小,自动伸缩Lambda所需的资源,这一切都是开发者无需关心的。

作者简介

吴龙辉,现任网宿科技云计算架构师,致力于云计算PaaS的研究和实践,《Kubernetes实战》作者,活跃于CloudFoundry,Docker,Kubernetes等开源社区,贡献代码和撰写技术文档。
邮箱:wlh6666@qq.com

0 个评论

要回复文章请先登录注册