什么是 Serviceless 和 FaaS?
这两年 云原生、Serviceless 和 FaaS 的概念开始火了起来,越来越多的团队开始在这方面进行投入,身在其中,我们当然也要去了解这些技术,或许会给我们开发带来新的变革。
Cloud Native(云原生)
云原生是一种基于云的基础之上的软件架构思想,以及基于云进行软件开发实践的一组方法论。云原生可以分拆为两个词,“云”和“原生”,其中“云”是和本地是相对应的,本地是指传统的的应用是运行服务器主机上,而云是指私有云、公有云和混合云;“原生”就是指土生土长的意思,是指应用在一开始就是基于云进行搭建的,云原生应用有几个基本的特点:微服务、DevOps、容器化等。
Serviceless(无服务器)
Serviceless 字面意思是指无服务器架构,无服务器不是指没有服务器,而是开发者无需关心服务器的维护工作,这些维护工作都是由云服务供应商提供,通过摆脱诸如服务器置备和管理等例行任务,开发人员就会有更多的时间专注于自己的应用开发,除之外,Serviceless 还应该提供自动伸缩功能,可以根据实际的使用情况,自动扩容和收缩服务的配置,甚至收缩到无服务实例的状态,通过事件触发创建实例,另外也应该具有按需付费的特点。
FaaS(函数即服务)
在理解这个概念之前我们先了解 IaaS 和 PaaS。IaaS 全程是 Infrastructure as a Service,基础设施即服务,就是我们通过租用云服务供应商提供的云主机,在云主机上搭建数据库和Web 服务器等,阿里云的 ECS 就属于 IaaS 产品。PaaS 全程是 Platform as a Service,平台即服务,供应商已经为我们搭建好了数据库、Web 服务器,我们可以直接调用数据库,另外我们也只需要把我们的代码上传到 Web 服务器即可完成部署,我们无需关心云服务器的工作等,比如 Google App Engine 就属于 PaaS 产品。
FaaS 的全程是 Function as a Service,函数即服务,在 PaaS 上更进一步,我们都不需要关心应用框架的搭建,我们只需要在供应商已经提供好的应用框架基础下编写函数的代码即可实现应用服务功能,连代码部署我们都不用关心。FaaS 是 Serviceless 一个典型的产品,应该要具备支持多种语言,服务自动伸缩,基于事件触发,按需付费等特点。FaaS的事件触发通常提供2种方式,一种是最常见的HTTP协议,支持GET和POST请求,另外一种是微服务之间的调度协议,通常是RPC协议。
适合场景
- CPU密集型:当我们需要实现CPU密集型的功能的时候,比如视频转码、音频转码、文件处理等,为了避免影响主服务器的稳定性,可以把消耗大量CPU计算的任务都迁移到函数计算上,运行在沙箱环境中。
- 瞬时高并发:当双十一来领,或者促销活动的到来,可能会导致短时间出现高并发的问题,如果我们预知流量的到来,我们需要提前部署足够的服务器,当这些粗发活动变成了常态性,比如每个星期定时发放优惠券,运维工作就变成了异常繁琐,如果利用FaaS的自动伸缩特定,当流量到来的时候云平台自动扩张,保证服务稳定。
- 轻量级服务:对于前端和客户端的开发者,搭建一个后台服务的成本是相对来说较高的,需要更多的学习成本和维护成本,通过FaaS服务可以使用非常低的成本即可搭建一个轻量级服务。
如何更加好使用FaaS?
- 基础服务BaaS化:由于Serviceless属于无状态服务器,短生命周期,意味着我们不能在服务器维护各种数据库连接的开销,也不能在容器生命周期内保存缓存,也不会在函数容器中搭建复杂的应用框架,所以需要简化基础服务的使用,如对象存储、日志存储、业务服务等,利用这些简化的服务,基于函数的服务就可以通过简单的编码实现各种功能。
优势
- 多语言支持:FaaS供应商通常会为开发者提供多语言支持,基本会覆盖主流的服务器开发语言,开发者只需要选择自己属于的语言进行开发。
- 自动伸缩、按需付费:传统的开发我们必须要为峰值预先部署足够的服务器配置和实例数量,然后我们也必须为空闲时间占用的服务而付费,而FaaS根据流量的情况自动伸缩服务实例的数量,不但可以减低突发事件导致的服务压力风险,同时我们只需要为实际占用的时长和配置进行付费。
- 开发成本低:开发者不再需要关心服务器的维护工作,也不用需要关心服务器框架的搭建,让服务端开发不只是后端工程师的专属,让更多的前端和客户端工程师也可以参与到服务端的开发中来,同时也减少了沟通的环节,让开发更加高效。
劣势
- 技术受限:由于代码是运行在供应商的服务架构体系,意味着我们需要根据供应商的环境来编写逻辑代码,如果需要更换供应商着要付出更大的成本。
- 基础服务受限:由于我们无法管理自己的服务器,意味着我们的多数服务(比如数据库)只能根据供应商有什么服务而选择使用,难以定制。
- 灵活性降低:由于服务器不受我们管理,意味着我们服务基于服务器做一些特点的控制。
FaaS探索的焦点
- 自动伸缩:由于服务的颗粒度精确到了函数和单个API级别,意味着供应商可以准确地监测到并发量和内存占用和CPU的运行时长,供应商可以根据实际的调用情况自动扩展和收缩服务器的数量。
- 快速弹起:如果当前是无任务无请求进来,FaaS服务实际上是不需要处于运行状态,完全可以处于停机状态,节省成本,由于服务的冷启动是需要一定的时间,当收到任务的时候如何快速弹起服务是非常重要。
Serviceless 产品
Serviceless FaaS
FaaS 是一个非常典型的 Serviceless 的产品,上文也详细介绍了FaaS的特点。
Serviceless PaaS
Serviceless除了FaaS,目前也有部分供应商提供应用级别的Serviceless PaaS平台,提供App Engine 和容器部署方式,PaaS 本身也有Serviceless一些特点,都是无服务器(开发者无需维护服务器),都可以实现快速扩容和收缩实例数量,但是不同的是Serviceless PaaS弥补了传统 PaaS 无法自动扩容收缩的能力,甚至可以收缩到无实例运行状态。好比如Serviceless PaaS是自来水,而传统PaaS是桶装水,自来水即开即用,而桶装水虽然也很方便,但是需要开发者预先计划好需要桶装水的数量。但是为了保证服务的连续性和快速响应,Serviceless PaaS通常会提供一个最小实例在维持工作,可以根据时间策略或者服务器的占用情况自动扩容和收缩服务实例,而传统PaaS是需要开发者手动进行扩容和收缩服务数量。所以在 Serviceless 加持下,PaaS的优势发挥的淋漓尽致。
总结
很多人分不清Serviceless和FaaS的区别,实际上FaaS只是Serviceless架构的一种产品形态。Serviceless FaaS虽然看起来很先进,可以在其有限的领域下,提供即开即用的功能,开发人员甚至不会用服务器开发即可完成一个web api的开发,比较适合前端和客户端的开发人员,但是由于缺少了灵活性,应用的场景其实是很有限,不适合用于主服务程序的开发。我认为Serviceless PaaS才是未来,在不丢失灵活性的情况下,提供弹性伸缩和按需付费,把Serviceless的特点发挥得淋漓尽致。Serviceless和FaaS没有一个绝对的定义,随着技术的演进,也会有新的解读,未来也会有更多的可能,更大的想象空间,所以我们不必拘束于当前的局限,一起向前看吧。