2.5 功能即服务
功能即服务(FaaS)是一种面向云端函数的、构建和部署服务端软件的新方式。FaaS在国内通常也称为云函数。
传统的部署服务端软件的方式一般是:首先要获得一个主机实例,可以是实体机、虚拟机或者容器;然后把应用软件部署到主机上,而后各种软件逻辑操作在应用软件中进行,如图2-2所示。
而在FaaS的部署模式中,则去掉了主机实例层和应用软件层,代之以云函数平台,这样使得开发者仅需要通过云函数实现应用逻辑的那些操作,然后把函数上传至云厂商提供的FaaS平台中运行,从而大幅度简化了软件开发流程,如图2-3所示。
图2-2 传统的部署服务端软件方式
图2-3 FaaS部署模式
FaaS是无服务器架构的一种,构建和管理基于微服务架构的完整流程,计算资源完全由云厂商管理和调度,由定时器或者事件触发,计算程序通常仅在触发后暂存在计算容器内,计算程序往往无状态(Stateless),且不采用会话(Session)机制来认证用户身份。
这里所谓无服务器并非是说不需要服务器来进行计算,而是说开发者不需要过多考虑服务器相关的问题,可以更专注于做产品代码上,同时计算能力也变成了一种可以按需获取按需付费的资源。
2.5.1 FaaS服务的特点和优势
相对于传统的服务器应用程序,基于FaaS的应用程序通常在模块功能上的设计相对单一,不同的功能往往分割到不同的云函数中处理,模块内聚程度相对较高。不同功能模块之间通过触发器来相互触发调用,功能模块之间的耦合度非常低。一个个高内聚低耦合的云函数非常有利于团队合作开发,也非常有利于后期的功能维护和缺陷定位。
每个云函数运行后通常都不能保留自己的运行状态和内存数据(静态变量有一些情况下会在同一个实例的不同调用周期间共享),因此每个实例启动的时候面对的是一个一致的干净的初始状态,不需要考虑历史状态的处理和维护。
由于云函数运行的容器由云服务提供商维护,因此FaaS的开发者一般不需要面对服务器运维、扩缩容等繁杂的事务(即使在访问压力超过了默认上限的情况下,往往也只需要提交工单申请提升上限就可以实现扩容),而且服务的安全性和稳定性相比自己维护服务器要高得多。
FaaS的一个劣势是冷启动带来的延迟问题。如果一个触发事件到来的时候,服务容器中没有可以立刻响应的实例,容器就需要启动新的代码实例来响应,根据服务商能力等不同,这个过程通常有毫秒级到秒级的延迟。各个云服务商都在通过优化淘汰策略和规则等手段独立降低冷启动率,而对于延迟非常敏感的业务,用户通常也可以用预热请求的方式来确保代码实例常驻在容器中,比如用定时器触发代码实例进行一个非常快的空响应。
FaaS的其他劣势包括语言版本落后(云服务商通常只提供最流行的几种开发语言的最稳定的几个运行环境)、依赖服务商提供的借口和周边产品能力带来的服务迁移困难等。
对于企业用户来说,FaaS相比传统的服务器架构有更浅的技术栈深度和更缓的学习曲线,这有利于团队提升效率,降低人力成本。而FaaS架构的一个劣势是难以进行传统的状态管理。因为FaaS架构的高度可扩展性意味着每个应用都随时会被创建出来新的实例或者销毁掉存在的实例,而实例不能长久地占有内存空间,因此要提供有状态的服务就必须要和独立的存储服务进行交互,这往往会增加服务延迟,导致占有了CPU和内存等资源却难以高效地利用。因此Serverless应用一般不通过会话(Session)认证用户身份,而是采用Json Web Token(JWT)之类的无状态身份验证机制来代替Session身份验证。
2.5.2 Serverless的典型应用场景
云函数的运行要由触发器来触发,因此Serverless架构的典型应用场景大部分都是与服务提供商提供的触发器进行绑定的。常见的云函数触发器包括定时触发、对象存储触发、消息队列触发、API网关触发等。相应的最常见的典型Serverless应用场景包括以下几个方面:
1)视频转码服务。在视频应用、社交应用等场景下,常常会让用户上传视频,而产品通常有把视频进行转码的需求,包括转换为不同的清晰度来适应不同带宽条件下的播放。通常视频文件会上传到对象存储中,然后用对象存储触发器来触发云函数对上传的视频文件进行转码处理,再把处理结果保存到对象存储中。
2)图片裁剪缩放。很多应用场景中都会让用户上传图像,而当用户上传高清原图的时候,产品往往需要对图片进行裁剪缩放来适应用户的显示终端,节省不必要的高清图像分发流量。通常图像文件会上传到对象存储中,然后用对象存储触发器来触发云函数对图像文件进行裁剪缩放处理,再把处理结果保存到对象存储中。
3)数据ETL(Extract-Transform-Load)处理服务。传统上对大数据的实时处理通常需要搭建hadoop或者spark等大数据相关的处理套件来搭建分布式的服务集群。通过Serverless技术,只需要把实时产生的数据不断地存储到对象存储中,并通过对象存储触发器触发数据处理函数对数据进行加工处理,并把处理结果存储到云数据库中。在腾讯云官网给出了这样的例子:证券公司每12 h统计一次该时段的交易情况并整理出该时段交易量top 5;每天处理一遍秒杀网站的交易流日志获取因售完而导致的错误,从而分析商品热度和趋势等。云函数近乎无限扩容的能力可以轻松地进行大容量数据的计算,利用云函数可以对源数据并发执行多个mapper和reducer函数,并在短时间内完成工作。相比传统的工作方式,使用云函数更能避免资源的闲置浪费从而节省资金。
4)网站和应用程序后端服务。Serverless云函数通过与API网关、对象存储及数据库等产品相结合,使开发者能够构建可弹性扩展的应用程序或者Web网站服务。而且这些程序可在多个数据中心高可用运行,无需在可扩展性、备份冗余方面做额外的投入。
5)小程序后端服务。包括微信、支付宝等平台型的手机APP都支持开发者利用平台能力快速轻量地开发小程序,在相应的开发者工具中,很多厂商都无缝集成了云函数作为小程序的默认后端服务。事实上小程序后端是当前云函数在国内最大的应用场景。
6)物联网(IoT)应用。物联网设备往往配备多个传感器持续监控环境搜集数据,持续采集到的海量数据会实时或者定时上报到服务器,而服务器往往需要即刻判断数据是否异常来决定是否采取相应的操作。传统架构下需要为服务后台准备大量的服务器进行数据实时处理,并需要为物联网设备的持续增量部署提前做好服务器冗余、采购好带宽资源,还需要对大量传感器同时触发并发上报准备好足够的服务资源,当使用了服务器集群还要做好相应的负载均衡,为了服务等弹性可能还需要设计集群弹性伸缩策略(即使这样遭遇访问压力时也往往需要几分钟的时间来进行伸缩),且需要做主机安全防范。而在基于无服务器云函数的架构之下,可以将API网关、云函数和时序数据库产品进行结合来取代传统的服务器或者虚拟机,这样不需要提前为增量设备和并发请求准备服务资源,只需要为实际被使用到的计算资源和网络流量付费,而且只需要维护函数逻辑而不需要维护主机的安全稳定。
2.5.3 主要的FaaS产品
1.函数即服务
这种服务专注于提供一个软件程序的运行环境,让使用者部署自己所编写的程序。每个程序只完成一项功能,所提供的接口供调用这个程序的应用按要求的格式提供功能所需的输入,程序运行后把输出结果返回给调用它的应用。
这种服务一般都支持常用的编程语音,包括Java、Python、Node.js、C#等。
属于函数即服务的产品包括AWS Lambda、Azure Functions、腾讯云的“云函数”、阿里云的“函数计算”等。
2.工作流即服务
这种服务专注于实现系统集成中的工作流程,为企业实现跨系统的业务解决方案提供方便。其功能可以涵盖对应用、数据、系统、以及通信功能的集成,可以支持在本地计算中心与在云计算环境中运行的程序的对接,并且完全不需要用户来设置或管理这些工作流本身所需的运行环境。
这种服务的一大特点就是要支持与各种常用系统的接口,包括文件系统、数据库系统、客服系统、电邮系统、ERP系统等。
目前市场上的工作流即服务包括微软的Power Automate、Azure Logic Apps以及亚马逊的AWS Step Functions。