Serverless 架构简述

云计算
本文介绍了 Serverless 架构概念,优缺点,FaaS 相关概念及特点,希望对你有所帮助。

作者 | 宗婷婷

随着云服务蓬勃发展,Serverless 架构近几年来被越来越多的企业使用,那么什么是 Serverless 架构呢?它有哪些优缺点?这篇文章带你详细了解 Serverless 架构。

什么是 Serverless 架构?

“_Serverless architectures are application designs that incorporate third-party “Backend as a Service” (BaaS) services, and/or that include custom code run in managed, ephemeral containers on a “Functions as a Service” (FaaS) platform._” 

这段来自Martin Fowler文章的定义是我觉得较清楚地讲清了什么是 Serverless 架构。那它有哪些特点呢?

  • 它是一种应用程序的设计。
  • 它包含第三方 BaaS服务。
  • 可包含运行及托管在 FaaS 平台上的自定义程序。

看了上面的特点,可能你还是有点懵,到底什么样的应用程序是 Serverless 应用程序,下面举个例子说明。

传统应用程序

图片图片

传统三层架构的应用程序:客户端-服务器端-数据库。服务器端控制着大部分业务逻辑,流程及安全。在这种情况下,客户端功能看起来很单薄,显得也不是很智能。

Serverless 应用程序

图片

  • 使用第三方 BaaS 服务来做鉴权,如 Auth0。
  • 使用第三方 BaaS 服务来存储数据,如 AWS DynamoDB, 客户端可以通过不同的安全策略来访问数据库。
  • 客户端拥有更多的逻辑,如导航功能;也可以控制部分的流程。
  • 去除了需要始终运行的服务器,由 API 网关来响应 HTTP 请求,并将请求路由到不同的 FaaS 函数。对于搜索功能,如果将其放在客户端,则客户端需要从数据库中取出非常多的数据,然后再根据条件筛选出需要的数据,如果数据量大的话,则非常低效,影响用户体验,因此将搜索功能作为 FaaS 函数,放在服务器端。
  • 将购课功能作为 FaaS 放在服务端,则是出于安全考虑,由于购课系统一般和支付相关,因此对安全要求比较高。

从上面例子可以看出,Serverless 应用程序不再需要“服务器”,Serverless 应用程序中每个组件都可以看成一个独立的子服务。,类似微服务。这样的架构更加灵活(可以很方便地去除或增加组件来添加或去除某些功能),也更加容易维护(修改某一个 FaaS 函数对其他函数影响会很小)。

但是,另一方面,这种灵活性同时也增加了系统的复杂性和成本,我们有可能需要维护很多个 BaaS 和 FaaS 服务,并且它们之间的沟通成本也会随服务个数增加逐渐递增。

BaaS - Backend as a Service 后端即服务

从上面例子可以看到,Serverless 架构包含很多个 BaaS 服务,那么BaaS 服务是什么呢?

BaaS(后端即服务)是一种云服务模型。在构建应用程序时,有时候会将一部分后端功能外包给云平台供应商,这部分外包的功能就是 BaaS。如通用的身份验证,数据库管理,云存储,消息推送和电子邮件验证等。将这些比较通用的功能外包给云平台供应商可以大大降低开发及维护成本。因此在 Serverless 架构中会集成多个 BaaS 服务,从而提升开发进度。

FaaS - Function as a Service 函数即服务

从前面的例子可以看出,Serverless 架构将传统服务器端的功能分散到不同组件中,一部分打包给 BaaS 服务,一部分放在客户端,还有一部分交给 FaaS 函数。

对于 BaaS 服务来说,因为由第三方提供,所以我们更多考虑的是怎么集成。对客户端来说,需要有 UI developer 来实现这部分功能。对于 FaaS,它以函数的形式提供服务,承载自定义代码,且可以独立运行在 FaaS 平台上。那它有什么特点呢?

  • 无需管理服务器。FaaS 运行在第三方云供应商提供的平台上,程序启动,运行等管理工作都可交由云供应商完成和监管。
  • 自动伸缩。FaaS 是完全自动,弹性的。意味着可以根据需要自动增加或减少 FaaS 的个数。
  • 支持HTTP请求。基本上主流云平台商都提供由 API Gateway 来触发 FaaS 函数。
  • 无语言限制。
  • 易部署。
  • 事件驱动。FaaS 函数由事件触发,事件是由云平台定义的;类似S3文件/对象更新,定时的 Task,Kinesis消息都可以作为事件来触发 FaaS 函数。

在使用 FaaS 时,我们还需要注意以下几点:

状态

FaaS函数是无状态函数,类似纯函数。这就意味着,你不应该将一个函数的状态用于同一函数的另一次调用。如果需要持久化 FaaS 函数状态,可借助外部持久化服务来实现。

启动延时

以 AWS lambda 方法为例,当 Lambda 接收到事件时,它会经历三个阶段,初始化,调用,销毁。在初始化阶段,Lambda 会尝试解冻之前的执行环境,若没有可解冻的环境,Lambda 会进行资源创建,下载函数代码,初始化扩展和 Runtime,然后开始运行代码。在调用阶段,Lambda 接收事件后开始执行函数。函数运行完成后,Lambda 会等待下个事件的调用。在销毁阶段,如果 Lambda 函数在一段时间内没有接收任何调用,则会触发此阶段。在销毁阶段,Runtime 关闭,然后向每个扩展发送一个“销毁事件”,最后删除环境。

触发 Lambda 时,若当前没有处于激活阶段的 Lambda 可供调用,则 Lambda 会下载函数的代码并创建一个 Lambda 的执行环境。从事件触发到新的 Lambda 环境创建完成这个周期通常称为 “冷启动时间”。

“冷启动”延迟无疑是无可避免的,也是影响用户体验的重要因素,因此应该设法减少“冷启动”时间。冷启动延迟取决于许多因素:语言、库、代码量、功能环境、VPC 资源。其中一些可以由开发人员减少,如选择轻量化的语言,优化代码量及调用轻量化的依赖包或sdk。

执行时间

FaaS 函数通常受限于每次调用允许运行的时间。目前,AWS Lambda 函数响应事件的“超时”最多为十五分钟,然后就会终止。Microsoft Azure 和 Google Cloud Functions 有类似的限制。

API 网关

FaaS 函数作为服务端应用程序,一般由事件触发,但是对于大多数应用程序而言,一般是以 HTTP 请求调用后端 API。因此会在 FaaS 函数之前搭载 API gateway。API gateway 会根据提前配置好的路由表,将HTTP请求路由到不同的 FaaS 函数上。

Serverless 架构的优点

(1) 降低运营成本

使用 Serverless 架构来构建后端应用,你不需要花钱请人来管理服务器、数据库和某些应用,与其他人共享基础设施(例如硬件、网络)也会降低成本。最后由于减少了人工成本,所以你在 Serverless 系统上花费的时间将会更少。

(2) 降低扩展成本

FaaS 函数的扩展和缩减完全是自动的,由供应商管理,你只需要按访问流量多少进行支付。当流量增加时,云平台会自动增加FaaS 函数个数来处理激增的请求,这时候费用也会增加;当没有请求访问时,平台会减少 FaaS 函数个数,因此费用也会减少。

(3) 降低开发成本

降低开发成本主要在于使用供应商提供的通用型 BaaS 服务,如上面提到的鉴权服务和数据库服务,这些服务只需要支付使用费用,不需要再次开发和维护。

() 更轻松地运营管理

函数的扩展是自动的,因此不需要手动管理并发数量问题。其次 FaaS 打包和部署也非常简单和快速,这也有效地降低了运维时间和人力成本。

Serverless 架构低成本构建,比较适合初创公司,其次Serverless 架构灵活性(增加和去除某些业务功能很方便)适合业务变化特别频繁的公司。最后快速的开发,部署及简单的运营管理特点,也让它拥有更短的上市时间,帮助企业更快抢占市场。

Serverless 架构缺点

固有缺点

(1) 供应商控制和锁定

供应商控制可能会导致一些问题,例如系统停机、意外限制、成本变化、功能丧失、强制 API 升级。当切换供应商时,可能需要更改代码、设计,甚至架构。你可以轻松迁移系统的一部分,例如 AWS lambda 函数,但对于应用集成的 Kinesis 或其他组件,每个云平台可能会有很大不同,这时候迁移可能需要很多工作量。

(2) 多租户问题

由于几个不同的租户在同一台机器上运行,虽然让他们觉得自己是唯一使用平台的人。但实际上,他们可能共享相同的基础设施,有可能会导致安全性及性能问题。

(3) 失去服务的优化权

如果应用程序使用了 BaaS 或云平台其他的组件(如:Knisis)构建服务,那么很难添加定制化的功能在这些服务或组件里。也就很难针对客户需求优化或者添加定制功能。

实现上的缺点

(1) 执行时间

Lambda 函数有执行时间限制,如果运行时间超过这个时间,它将被中止。如果某些业务比较复杂,确实需要超过十五分钟的执行时间,那么它将无法使用 Serverless。

(2) “冷启动”延时

对于性能要求比较高的业务,“冷启动”延时是必要考虑的因素,当然也可以通过上述某些手段减少延时时间。

(3) 测试和Debug

单元测试并不是什么问题,但是到了集成测试就是个问题了。FaaS 比其他服务器代码小,集成测试更重要。但是在没有任何云环境的情况下,很难在本地运行并调试集成测试。对于本地Debug,可以采用写单元测试来Debug。因为可以在单元测试中mock所有集成的云平台模块,如 Kinesis, IoT client 等。

(4) 监控

对于 Serverless 而言,只能看到供应商提供的数据及指标,虽然有些供应商会开放一些接口,让使用者定制某些指标,但还是会受限于供应商。

责任编辑:赵宁宁 来源: Thoughtworks洞见
相关推荐

2017-03-15 19:03:05

云计算

2017-05-29 08:18:11

Serverless架构软件系统

2023-12-09 14:33:05

2017-08-15 13:05:58

Serverless架构开发运维

2012-06-07 10:31:12

SOA架构设计原则

2022-09-30 08:43:09

Serverless无服务器云计算

2018-03-26 04:53:46

Serverless微服务架构

2012-06-07 10:35:40

架构设计业务逻辑Java

2012-06-07 10:53:08

架构设计数据访问层设计原则

2023-08-27 15:20:58

Serverless架构开发

2009-06-22 16:34:30

框架架构设计模式

2020-04-03 13:12:09

函数架构 Serverless

2017-12-07 12:47:48

Serverless架构基因

2018-05-25 14:41:56

Serverless无服务器构造

2021-09-13 18:09:59

腾讯文档业务云计算

2020-03-26 21:32:53

BaasFaasServerless

2019-03-18 15:36:32

无服务器FaasServerless

2021-09-18 10:23:43

Serverless

2021-09-08 10:12:39

Serverless 云计算

2020-05-06 16:47:59

ServerlessMVC架构
点赞
收藏

51CTO技术栈公众号