系列文章目录
无服务器配置可以充分挖掘云服务的潜力。了解无服务器对于设计现代应用程序至关重要,因此本文以谷歌云产品为例,介绍云服务中的无服务器架构。
无服务器概述
什么是无服务器架构?
无服务器架构(无服务器计算)是指例如 Google Cloud(以前称为 GCP)这样的云提供商将他们所拥有的庞大资源,如 CPU、内存和存储的一部分提供给用户,用户只在需要时使用他们所需的资源量,且只为他们所使用的资源付费的一种服务方式。以下简称无服务器。
典型的产品包括亚马逊网络服务(AWS)的 AWS Lambda 以及谷歌云的 Cloud Functions 和 Cloud Run 等开发人员服务。谷歌云的 BigQuery 等服务也被认为是无服务器服务,它可以在不了解基础设施的情况下使用数据库和其他服务。
换句话说,“无服务器”一词指的是所有无需考虑服务器资源即可使用的服务。
术语定义
Cloud Native Computing Foundation (CNCF) 是一个致力于推广云原生的非营利组织,它将”无服务器“一词定义为"FaaS,以及作为 API 服务提供的 BaaS 两者其中之一"。
定义中的 FaaS 和 BaaS 指的是以下服务
无服务器类型 | 説明 | 适用的 Google 产品 |
---|---|---|
FaaS(功能即服务) | 提供事件驱动计算。 用户可以使用由事件或 HTTP 请求触发的函数执行应用程序代码。 | ・Cloud Functions |
BaaS(后端即服务) | 通过应用程序接口提供作为应用程序子集的功能,如身份验证和数据库。 | ・Firebase(数据库、身份验证等) ・Cloud Endpoints ・Cloud Run(容器平台) ・BigQuery(分析型数据库) |
无服务器的特点
优缺点
无服务器有三大特点,各有以下优缺点
特徴 | 优点 | 缺点 |
---|---|---|
无需配置、运行和管理基础设施资源 | 减轻基础设施建设和运营的负担 | 配置灵活性低 |
动态缩放 | ・无需容量规划 ・通过零规模节约成本 | 冷启动导致即时响应低 |
従量課金制 按量付费 | 在资源方面具有成本效益 | 难以预测成本 |
特点① 无需对基础设施资源进行调配或运营管理
无需意识基础设施
"无服务器"一词听起来好像没有服务器,但事实上,在云提供商的数据中心中是有物理服务器的。
无服务器实际上意味着用户无需意识到服务器的存在。他们只需提供代码、容器映像等,而将运行这些代码和映像的基础架构的调配和运营管理交给云提供商。
术语"配置"是指分配服务器资源和创建虚拟服务器等基础设施资源,可视为 “预构建”。
无服务器用户不再需要花费精力考虑容错问题,如备份和冗余,或操作系统和中间件的补丁,而可以专注于应用程序开发。
灵活性较差
这些优势的代价是,无服务器在一定程度上限制了应用程序执行环境的自由度。
例如,谷歌云的 FaaS 服务 Cloud Functions 对可使用的开发语言、代码执行时间和并发执行次数都有限制,因此在基础设施配置方面不如 IaaS 服务的 Compute Engine (GCE) 灵活。
用户责任范围
下图摘自谷歌云文档,显示了云提供商和用户之间分担责任的范围。关于无服务器的责任分担范围,您可以查看 "SaaS "一栏。
无服务器允许云提供商管理除应用逻辑(内容)和资源访问控制(访问策略)之外的一切。
特点② 动态缩放。
动态资源分配和零规模
使用无服务器时,基础设施资源可根据需要动态扩展,因此无需提前规划资源量。
如果负载过高导致资源不足,则自动添加资源,并在处理完成后自动释放不再需要的资源,这样就不会再有资源处于待机状态。
这使用户无需采取任何措施就能应对申请量意外增加的情况,并减少因资源过多而导致的收费增加。
尤其重要的是,当完全不进行处理时,无服务器可将资源扩展为零(零扩展)。
再加上下文所述的 "按量付费"功能,可以在不进行处理时将资源使用成本降至零。
冷启动
此类功能在扩展方面的一个缺点是,冷启动会导致延迟增加。
如果在资源零缩放时向应用程序发送请求,就会影响响应请求的即时性,因为在进行实际处理之前,首先要分配资源,应用程序也要做好运行准备。
特徴③ 按量付费
成本优势
在 IaaS(如 Compute Engine)或托管云服务(如 Google Kubernetes Engine (GKE) 或 Cloud SQL)中,虚拟服务器会预先配置 "实例 "或 "节点 "等资源、其基本机制是预先配置所使用的资源量,因此即使没有进行处理,只要资源被预先配置,就会收费。
另一方面,无服务器的工作原理是对实际进程中使用的资源而非分配的资源收费。收费基于应用程序的运行时间和请求数量。
计费机制举例
典型的谷歌云无服务器产品定价如下。
产品 | 課金対象 课金対象 | 無料枠 无料枠 |
---|---|---|
Cloud Functions | ・实际处理 CPU 和内存的时间 ・调用次数 ・向外网络传输数据量(传输到互联网或其他地区) | ・毎月 200,000 GHz 秒 (CPU)、400,000 GB 秒(メモリ)まで無料 每月免费高达 200,000 GHz 秒(CPU)和 400,000 GB 秒(内存)。 ・毎月 200 万回まで無料(呼び出し回数) -每月最多可免费拨打 200 万次电话(通话次数)。 ・毎月 5 GB まで無料(ネットワーク) 每月免费高达 5 GB(网络) |
Firebase (例如 Firestore) | ・实际存储的数据量 ・外向网络传输量 ・写入操作次数 ・读取操作次数 ・删除操作的次数 | ・毎月 1 GiB まで無料(データ量) 每月免费高达 1 GiB(数据量) ・毎月 10 GiB まで無料(ネットワーク) 每月免费高达 10 GiB(网络) ・每天最多可免费 20,000 条信息(写入) ・每天免费多达 50,000 条信息(读取) ・每天免费多达 20,000 条信息(删除) |
Cloud Endpoints | ・API 调用次数 | ・每月免费次数高达 200 万次 |
BigQuery | ・查询处理的字节数 ・存储器中存储的数据量。 | ・每月免费高达 1 TB(查询费) ・每月免费高达 10 GB(存储收费) |
Cloud Run | ・CPU 和内存的实际使用时间 ・调用次数 ・向外网络传输数据量(传输到互联网或其他地区)。 | ・毎月 180,000 vCPU 秒 (CPU)、360,000 GiB 秒(メモリ)まで無料 每月免费高达 180,000 vCPU 秒(CPU)和 360,000 GiB 秒(内存)。 ・每月最多可免费调用 200 万次(调用次数)。 ・每月免费高达 5 GB(网络) |
如表中所示,无服务器产品的免费时段范围很广,简单的流程完全可以在免费时段内完成。
难以预测费用。
无服务器现收现付系统的一个缺点是成本难以预测。
例如,IaaS 可以根据预先分配的资源来计算费用,而无服务器则不同,其费用取决于实际进行的处理量,因此更难在开始运营前估算成本。
用例
适合无服务器的处理
根据目前所描述的无服务器功能,可以将其应用于以下场景:
- 每次处理时间短
- 进程并非一直运行,也不知道何时会被调用
具体来说,以下类型的处理适合无服务器。
- 对流量较小的网站进行后台处理。
- 执行由数据库更改(插入、更新、删除)触发的逻辑
- 运行 ETL(ELT)工作
- 聊天机器人的后端处理
- 执行计划的批处理工作。
- 托管机器学习模型。
谷歌云产品中的示例
Cloud Functions 和 Cloud Run 可直接从 HTTP 请求调用,或通过与 Eventarc 和 Pub/Sub 集成由各种事件触发(事件驱动)。
与 Cloud Scheduler 集成后,可使用 cron 作业定期调用函数,从而使其适用于在一定时间范围内进行批量处理。
Cloud Run 还能以最小的运行负载托管网络应用程序,并在容器镜像中部署机器学习生成的模型,以便使用模型无服务器地实施在线预测 API。
不适合无服务器的模式
对应用程序执行环境有特殊要求的案例
无服务器允许云提供商对资源进行操作控制,但限制了应用程序执行环境的配置。
例如,只需上传代码即可使用 Cloud Functions,但对开发语言的类型和版本有限制。
由于上传目标是容器镜像,Cloud Run 提供了更大的配置灵活性,但由于到 2023 年 5 月还不支持 GPU,因此必须使用 Compute Engine 或 GKE 来实现基于 GPU 的处理。
与 Compute Engine 相比,这些无服务器计算产品为应用执行预留的 CPU 和内存限制也更低。
需要立即回应请求的情况。
在资源被零规模化的状态下处理请求时,由于冷启动的影响,在某些情况下,其延迟可能会比那些始终保持资源不释放的非serverless实现更高。
注:这里的“零规模化”是指资源被缩减到最小或接近于零的状态,“冷启动”是指系统从闲置状态恢复到能够处理请求所需的状态的过程。
不过,我们有一个对策:可以对 Cloud Run 进行配置,以确保最低数量的资源始终可用,作为冷启动对策。当然,这需要权衡零扩展的成本优势。
此外,Cloud Run 还提供了 “Startup CPU boost” 功能,该功能可在冷启动时提高性能,但需额外收费。这些措施可以在一定程度上解决零规模时的延迟问题。
不断收到请求的情况
在按资源使用时间和调用次数计费的服务模式下,如果需要持续接收对应用程序的请求,则可能更适合使用IaaS(基础设施即服务)或非无服务器的托管服务。这样可以通过诸如“预留使用折扣”等优惠来获得成本优势。
使用无服务器构建系统时的注意事项
无状态实施
无状态实施
得益于动态扩展的特性,构建在无服务器平台上的应用程序需要采用无状态的实现方式,也就是说,处理过程不应在内部保存状态。
设计应用程序时,应将会话信息等应持久化的状态和数据存储在外部数据存储区,以免在扩展过程中丢失。
会话信息的外部存储。
例如,在提供无服务器容器执行环境的 Cloud Run 上托管 Web 应用程序时,会根据请求量进行动态扩容,不能保证来自同一客户端的请求总是被发送到同一个容器。
Google Cloud 提供 Cloud Memorystore 服务,这是一种托管服务,用于托管 Redis 和 Memcached 等内存数据库。
此外,作为参考信息,Cloud Run 提供了最佳-effort 的 会话亲和力功能,但该功能主要应用于缓存场景,并不是为了使容器具有状态性。
数据持久性
动态扩展会在请求较少时(即容器被销毁时)缩放,因此需要持久化的数据无法存储在容器侧。
设计应用程序时,应将需要持久化的数据存储在 Cloud SQL(托管 RDBMS)或 Cloud Storage(对象存储)中,而不是 Cloud Run 容器端。
意识幂等性的实施
幂等性是一个操作无论执行一次还是多次,其结果都相同的属性。
例如,在 Cloud Functions 等 FaaS 中,由于最大资源和执行时间的限制,不能在单个云函数中完成应用程序的所有处理,而是要为多个小进程中的每个进程创建一个函数的微服务的形式来执行处理。
如果一个流程是由多个功能实现的,那么在流程中间出现问题时,取消(回滚)流程就有可能变得复杂,流程可能会从头开始重试,中间流程的结果会保留在数据存储中,而这可能不会得到相同的结果。
例如,如果由于重试而向数据库写入两次,导致同一记录出现两行重复,这种情况就不是幂等性。
相反,以下这种实现可以被认为是具备幂等性的例子。
- 在写入数据之前,会检查数据是否存在,如果存在,则不会写入。
- 如果数据已存在,则重写;如果不存在,则添加(UPSERT in SQL)
说明性文章链接
有关谷歌的无服务器产品的更多信息,请参阅以下文章。
- Cloud Run 彻底解说
- Cloud Functions彻底解说
- BigQuer彻底解说(待续)
- Firebase 彻底解说(待续)