1、什么是serverless

Serverless 架构作为一种新型的云计算范式,是云原生时代一种革命性的架构,颠覆了传统意义上对软件应用部署和运营的认识。本节对 Serverless 架构的基本概念、技术实现和 Kubernetes 上的 Serverless 框架分别进行阐述。


Serverless 架构的核心理念是让用户不用关注服务运行所需要的计算资源,主要关注业务逻辑的构建。这样做可以降低业务开发的成本,提高业务构建和交付的效率。用户不在需要花费时间和资源来进行服务器配置、维护、更新、扩展和容量规划。所有的这些任务和功能都由 Serverless 平台处理,并完全从开发人员和 IT/运维团队中抽象出来。


2、Serverless应用架构

serverless入门介绍_kubernetes

3、Serverless 架构与传统架构的区别

3.1、按需加载

与传统架构最大的区别在于,在 Serverless 架构中,由底层的容器平台管理应用的启动和关闭。应用程序是否正在运行取决于当前是否有事件触发或请求访问该服务。当有事件触发或者请求访问时,服务会被自动启动。当一段时间服务不被使用,平台将关闭该服务等待下次触发。


3.2、事件驱动

Serverless 架构的应用是通过事件驱动的方式实现按需加载,不需要传统函数中监听类型的应用一直在线。当事件源中包含的事件发生变化,会根据不同的事件源类型触发不同的事件,进而执行不同的响应函数完成对应的请求操作。事件源的类型可以有很多种,如 http 请求,数据库修改、消息发送和文件上传等。

3.3、状态非本地化持久

由于应用和服务器解耦,应用不再绑定到特定的服务器上,每次事件触发后的服务实例可能运行在集群中任意一个服务器节点。因此,服务器节点不会保存该节点上应用的状态,这个传统架构有很大的区别。

3.4、非会话保持


由于应用不再绑定到特定的服务器上,每次处理请求的服务实例可能在同一个服务器节点上,也可能在不同的服务器节点上。因此,同一个客户端的多次请求无法保证被同一个服务实例处理。传统架构中很容易实现的会话保持功能,不适用于 Serverless 架构应用。因此,无状态的应用比有状态的应用更加适合Serverless 架构。

3.5、自动扩缩容


Serverless 架构的底层平台原生支持自动扩缩容策略,会根据应用访问量的变化动态调整服务实例的数量来满足应用访问的需求。

3.6、应用函数化

Serverless 架构中一个应用被分解为多个细粒度的函数,通过多个函数之间的编排调度实现业务逻辑。这些函数本身都是无状态的函数服务,无法进行状态保存和会话保持。在 Serverless 架构的实现中,应用函数化是一种重要的实现方式。

3.7、依赖服务

为了提高开发效率,现在的服务在开发过程中利用了很多第三方工具,如消息队列、数据库、缓存等。如果只有当前应用服务化,其他依赖的第三方工具需要用户单独进行管理和部署,那么整个应用服务依旧被服务器资源等条件限制。因此,Serverless 架构应用所依赖的第三方工具也必须服务化。


4、Serverless缺点


  • 只管理无状态服务。Serverless要实现工作负载的自由缩放,就必须要求服务是无状态的。有状态的服务由于需要维护存储状态信息,并不适合Serverless平台进行管理。这应该是Serverless本身的特点所致。
  • 延迟问题。Serverless应用是高度分布式、低耦合的,服务之间的通信比较频繁,有可能会导致应用的整体延时加大。另外,由于Serverless应用是按需分配计算资源,有可能会产生冷启动延迟。
  • 厂商标准不统一问题。当前,各厂商的Serverless产品的标准不统一,导致软件不能跨厂商迁移,客观上造成了厂商锁定问题,这是制约Serverless发展的最主要因素。

5、Serverless的使用场景

尽管Serverless计算已被广泛应用,但它仍然是较新的技术。一般来说,当工作负载为以下情形时,Serverless应被视为首选。


  • 异步、并发、易于并行化为独立工作单元的工作负载。
  • 低频或有零星请求,但具有较大不可预测扩容变化需求的工作负载。
  • 无状态、短期运行、对冷启动延迟不敏感的工作负载。
  • 业务需求变化迅速,要求快速开发实现的场景。

6、Serverless 技术实现

Serverless 架构实现分为两个部分:函数即服务(Function as a Service, FaaS)和后台即服务(Backend as a Service, BaaS)。其中 FaaS 是一种构建和部署服务的新方式,BaaS 是以 API 形式提供第三方服务。Serverless 实现的构成如图 所示。

serverless入门介绍_事件源_02

6.1、FaaS

FaaS 提供了一种构建和部署服务的新方式,将应用分解为多个函数服务,通过多个函数之间的编排调度完成业务逻辑[27]。函数并不会一直处于运行状态,只有在需要时才会运行,其它时间都是空闲状态。FaaS 的核心是事件驱动,除了提供代码存放和代码执行的功能,FaaS 还会提供各种同步和异步的事件源集合。比如 HTTP API Gateway 就是一个同步事件源;而消息队列,对象存储等就是异步事件源。


FaaS 作为 Serverless 架构重要组成部分,为基于Serverless 架构的应用提供一套完整的开发、运行和管理的解决方案。将应用部署到 FaaS 平台上,应用运行所需的底层服务资源由平台统一管理。由于在应用开发中经常需要使用到第三方服务,如数据库,消息队列和分布式缓存等。如果应用依赖的第三方服务以传统方式部署运维,用户依旧需要对这些第三方服务需要的资源进行管理。对于 Serverless 架构而言,这种情况并没有完全实现应用程序 Serverless 化。

6.2、BaaS

BaaS 为实现应用的第三方依赖工具服务化提供了解决方案。通过 BaaS平台可以将数据库、文件存储和消息队列等第三方工具服务化,让用户以 API的形式进行访问,按照使用量进行付费。BaaS 平台使得用户不需要关注第三方服务底层计算资源的运维,极大的减少了应用运维的工作量和成本。


为了让应用程序完全 Serverless 化,用户不但需要利用 FaaS 平台将自身应用Serverless 化,而且需要通过 BaaS 平台将应用依赖的第三方服务进行Serverless化,这样才能最大程度发挥 Serverless 架构的优势。


参考

Serverless 架构调度策略研究

深入浅出Serverless:技术原理与应用实践-陈耿-微信读书