3.3 Serverless架构模式
Serverless是一种新型的云计算运行模式,是指由云平台提供应用运行时需要的服务器,并且动态管理应用运行时需要的资源分配。Serverless的定价基于应用程序实际消耗的资源量,无须用户提前购买计算资源,因此对计算资源的利用更有效。Serverless可以简化代码实现应用替换和升级的部署工作,而且开发者不需要关心环境配置、容量规划和运维操作等(这些对开发人员都是不透明的)。在大多数情况下,云平台将Serverless以函数的方式(FaaS)提供给开发者,程序主要执行无状态的业务逻辑,数据保存通常由对接的存储服务提供。
这一点理解起来可能会有点抽象,下面以具体的案例详细说明。假设我们要开发一个个人博客系统,主要包含两部分:前端的静态站点,主要负责站点和文章的呈现;后端的HTTP REST接口,主要负责加载编写的博客内容。静态站点使用Svelte编写,然后调用rollup编译Svelte并打包;HTTP REST接口使用Node.js编写,并调用云服务商提供的KV服务,完成博客文章的保存和读取。
作为资深的前端工程师,我们很快就可以完成前端界面和后端逻辑代码的编写,然后在本地完成测试,并部署博客服务。在部署博客服务时,我们需要购买云平台的虚拟机。配置太低,如带宽和内存太小,对性能的影响会非常大,且会影响用户体验。而购买一个高性能的虚拟主机,个人每个月需要花费300元左右,感觉不太值得。最终,我们选择了一个中等配置的虚拟机,每个月需要花费120元左右。接下来为虚拟机设置环境,如在Ubuntu 20.04操作系统下安装Nginx,需要配置对应的nginx.conf、安装Node.js环境等。然后编写一些管理脚本,如将代码同步到虚拟主机、重启Node.js应用等。经过一系列准备,我们开发的个人博客上线了。
博客刚上线时,我们花费大量时间来美化站点,同时发表大量技术文章,如TypeScript 4.0新特性、Deno入门、Webpack 5介绍、RxJS 7新特性等。但事与愿违,访问量并不高。更可怕的是,操作系统存在安全漏洞。
这时,云厂商推出了基于Serverless架构设计的FaaS平台,可以帮助我们快速部署静态站点、Node.js服务等,而且是按访问量收费的——100万次访问只收费3元,网络流量每兆字节为0.8元。如果月访问量低于10万次,且网络流量低于5GB,则服务完全免费。这样的便利和优惠非常诱人,我们再也不用考虑Nginx配置、Node.js环境安装、脚本管理、安全包更新等,只要使用该平台的命令行工具即可完成发布。
读者可能会产生疑问,难道不用再关心Nginx和Node吗?答案是不用关心。无论是Nginx,还是云厂商自研的Web服务器为静态站点提供的服务,我们都不用在意,也不用关心Node应用在哪里运行。只要对应的Node版本满足要求,能通过命令行工具和管理控制台查看应用日志,就足够了。
对于云厂商来说,Serverless市场的竞争非常激烈,尤其在技术方面。例如,我们编写了一个函数服务,如果云厂商A的价格是100万次访问10元,而云厂商B的价格是100万次访问5元,那么在提供的访问体验相同的情况下,我们可能会选择云厂商B的服务。这样的技术竞争对用户是有利的,用户将会获得价格更便宜、体验更好的技术服务。那么,如何实现高性价比的FaaS结构呢?相信不少读者已经看过图3-9所示的非容器化的Serverless架构。
图3-9 非容器化的Serverless架构
采用传统的应用启动和隔离策略来运行Serverless应用(如容器化),并不是一个很好的策略。从图3-9中我们可以看到,独立进程带来的额外消耗是非常大的,诸如会占用更多的内存、重复的EventLoop开销等,因此更理想的方案是基于独立进程内的隔离策略,即进程本身支持多租户的架构设计。这样可以将额外的资源损耗降到最低,从而降低微服务应用资源的成本。然而,目前基于独立进程内部的隔离策略并不是一个通用的解决方案,例如,在一些编程语言或者应用类型下就比较难实现,所以一些FaaS平台对编程语言提出了特定的要求,例如只支持JavaScript。这样做的好处是可以使隔离性做得更好、更安全,同时保证价格最低;坏处在于无法支持多语言Serverless应用的开发。上文提到过,FaaS程序主要执行无状态的业务逻辑,图3-9所示的架构设计也体现了这一点,那就是基于独立进程内的隔离策略无法实现为代码提供资源独占的需求,如锁定一块内存用于存放用户登录后的会话信息。不过,大家不用担心,FaaS平台通常会提供相应的高性能KV存储方案,用于解决状态存储的问题,以及提供缓存、事件通知和订阅等配套服务。
在微服务架构的应用越来越普及的前提下,大多数开发者逐渐接受并采纳了Serverless。在实际的Serverless开发中,由于与容器类技术方案不太一样,Serverless平台并没有通用的规范,所以不同云厂商的Serverless平台的部署方式和API等都不太一样。但是,大家也不用太担心,Serverless平台架构会遵循CNCF Serverless白皮书开发规范。