参考:FaaS(函数即服务) + BaaS(后台即服务)、拉钩教育《玩转 Serverless 架构》课程、Faas,又一个未来?
Serverless 说白了,就是一种不用关心服务器的架构思想,开发者可以不关心除业务代码之外的事情,进而提高业务的迭代效率,使用的云服务也是用多少付多少,从而节省成本。总的来讲,Serverless 对开发者研发方式的影响是巨大的。
因为基于 Serverless,后端工程师不用再关心系统运维,可以专注于业务开发,深入业务细节,使业务快速迭代,帮助业务成功。
说到 Serverless,就不得不说云计算,因为云计算的发展史就是 Serverless 的兴起史。纵观云计算的历史,我们可以将其分为物理机时代、虚拟机时代、容器时代、Serverless 时代
物理机时代,网站上线和稳定运行面临的最大问题就是服务器等硬件问题,你既要购买服务器,还要承担服务器的场地、电力、网络等开销,并且还需负责服务器的维护。好在随后几年随着虚拟化技术逐渐成熟,云计算逐渐进入虚拟机时代,这也给我们带来了希望。
云产品常见分层
Iaas
最初云厂商都是卖硬件,AWS 的 EC2、阿里云 ECS、Azure Virtual Machines,这种云计算形态也被叫作 IaaS(基础设施即服务)
Paas
在裸机上部署操作系统后就是 Paas,提供了一个可运行环境
Saas
后面随着业务形态发展,云厂商发现可以抽象出一些通用的平台,比如中间件、数据库等,于是就把这些功能做成服务,也放在云上去卖,这就是 SaaS。
云数据库有专门的服务器,并且还提供了备份容灾,比自己在服务器上安装数据库更稳性能更强。
对象存储能无限扩容,不用担心磁盘不够了。
这样一来,服务器就只负责处理用户的请求,把计算和存储分离开来,既降低了系统负载,也提升了数据安全性。并且单机应用升级为了集群应用,通过负载均衡,会把用户流量均匀分配到每台服务器上。
不过在服务器扩容的过程中,你还是会遇到一些麻烦。 比如购买服务器时,会发现之前服务器型号没有了,只有新的型号,并且每次新扩容一台服务器,都需要在上面初始化软件环境和配置,还需要保证所有服务器运行环境一致,这是个非常复杂还容易出错的工作。
总的来说,虚拟机可以让你不用关心底层硬件,但是如果能让我们不用关心运行环境就更好了。于是,容器技术诞生了。
容器时代
你还使用了 Kubernetes 来做管理容器集群。基于 Kubernetes 和云厂商提供的弹性能力,你可以实现网站的自动弹性伸缩。目前使用 k8s 的成本还比较高,还需要开发者自己去维护集群,编写繁多的 YAML 来部署应用。
问题:
1、因为你需要去规划节点和 Pod 的 CPU、内存、磁盘等资源,需要编写复杂的 YAML 去部署 Pod、服务,需要经常排查 Pod 出现的异常,需要学习专业的运维知识。
2、容器扩缩容时间长,不能实现秒级扩缩容。
Serverless
在 Serverful 的架构下,开发首先需要分配或找到可用的资源,然后加载代码和数据,再执行计算,将计算的结果存储起来,最后还需要管理资源的释放。
现阶段关于 Serverless 的实现主要是基于 FaaS(函数即服务) 和 BaaS (后端即服务)的方案。
FaaS 提供了运行函数代码的能力,并且具有自动弹性伸缩。基于 FaaS,我们应用的组成就不再是集众多功能于一身的集合体,而是一个个独立的函数。每个函数实现各自的业务逻辑,由这些函数组成复杂的应用。
BaaS(Backend as a service),“后端即服务”, 是将后端能力封装成了服务,并以接口的形式提供服务。比如数据库服务、文件存储服务等。通过 BaaS 平台的接口,我们运行在 FaaS 中的函数就能调用各种后端服务,进而以更低开发成本实现复杂的业务逻辑。
有了 IaaS,我们不需要关注物理机;有了 PaaS,我们不需要关注操作系统;有了容器,我们不需要关心运行环境;而 Serverless 技术的出现,能够让我们不再关心传统的运维工作,让我们更专注于业务的实现,把时间精力花在更有意义的事情上,让我们以更快的速度、更低的成本完成应用的开发迭代,进而创造出更大的价值。
谁在维护serverless的底层
使用 Serverless 有两个途径,一是使用公有云 Serverless 产品,二是自己私有化部署 Serverless 平台。
如果使用公有云 Serverless 产品,底层机器全都由云厂商维护。Serverless 的弹性能力也由云厂商实现。缺点就是你需要依赖云厂商。
如果在自己的服务器集群上部署 Serverless 平台(私有化部署),但这样就需要自己维护底层机器了,运维成本和经济成本都很高。
为什么没有提到Saas
SaaS 的话,是厂商直接提供软件服务,用户花钱购买使用,也就不用自己设计网站架构了
Pod(容器组)是Kubernetes项目的原子调度单位
serverless为什么能实现秒级切换
k8s 的弹性有两种,一种是 Pod 的伸缩,快的话可能几秒钟,这与镜像大小、网络环境等因素有关,并且每次 Pod 扩容都是创建一个全新的 Pod;另一种是节点的伸缩,需要创建新的机器,通常需要几分钟,而 Serverless 则不需要我们关心机器。所以整体上,我认为 Serverless 是秒级弹性伸缩,而 k8s 是分钟级。
一方面是优化了容器本身的启动速度,另一方面是通过容器重用、执行上下文重用等方案,尽可能避免从零初始化一个容器,这样 Serverless 函数就可以实现几十毫秒甚至几毫秒的弹性伸缩。
Severless和容器的关系
目前绝大多数 Serverless 平台底层实现,都是基于容器技术的,Serverless 平台可以基于容器技术实现函数的资源隔离、CPU 和内存限制等。
Serverless的特点
Serverless 架构的主要特点是按量付费、弹性伸缩、不用运维
无状态。基于 FaaS 和 BaaS 的架构,是一种计算和存储分离的架构。 计算由 FaaS 负责,存储由 BaaS 负责,计算和存储也被分开部署和收费。这使应用的存储不再是应用本身的一部分,而是演变成了独立的云服务,降低了数据丢失的风险。而应用本身也变成了无状态的应用,更容易进行调度和扩缩容。
缺点:由于函数无状态,我们就需要使用数据库来存储状态,每次执行就需要访问数据库,就会有大量的网络 I/O,进而降低代码执行的效率。我们大多数应用都是有状态的,比如本地缓存、数据库连接池以及进行通信等,FaaS 的局限就会让我们开发复杂的后端应用变得困难
函数通信效率低
如果两个函数的数据有依赖,需要进行通信、交换数据,就要进行函数与函数之间的调用(调用方式是 HTTP 调用)。相比之前的内存调用,数据交互效率显然低了很多。而这个问题的本质,是 FaaS 还没有比较好的数据通信协议或方案。