Serverless无服务器架构详解
本文对Serverless架构的基础概念、具体产品、应用场景、工作原理进行详细解析。
基础概念
Serverless: 无服务器架构,即在无需管理服务器等底层资源的情况下完成应用的开发和运行,是云原生架构的核心组成部分。
通俗来说,如果将购买一台物理服务器比作买车,购买云服务器就类似于租车(租赁期间需要驾驶和维护,且即使闲置也需付费),那么Serverless则类似于出租车(只需乘坐,按里程计费)。
从技术层面来说,我们可以简单理解为:Serverless = FaaS + BaaS。一个完整的Serverless应用一般由FaaS层的云函数负责无状态的计算,由BaaS层组件负责状态的维护:
FaaS(函数即服务,Function as a Service):将函数代码托管给云产商,以服务形式运行,支持事件触发。代表产品有腾讯云SCF、AWS Lambda等。
BaaS(后端即服务,Backend as a Service):指云平台提供的后端组件整合,开发者无需开发和维护后端服务,通过API/SDK的调用便可获得例如数据存储(对象存储、云数据库、云中间件等)、消息推送、账号管理、地图定位、AI、IoT等能力。

特点及优势:
免运维:无需管理基础设施 —> 可以专注业务开发
按量计费:闲时不计费 —> 降低成本
弹性伸缩:峰时自动扩容 —> 无需考虑可用性问题
劣势及适用场景:
冷启动延迟: 一定时间内的首次调用可能需要冷启动(如进行加载代码、拉起容器等任务)—> 适合对响应速度要求不是太高的接口,更适合异步任务,不适合启动耗时久的Java项目
开发和管理设施: Serverless应用的调试、测试、排障、发布等设施暂不成熟 —> 目前更适合后端逻辑不太复杂的轻量级应用
云产商绑定: 不同云产商提供的组件(如存储)接口不同,可能增加未来迁移成本 —> 使用标准化框架,并在设计时尽量隔离通用逻辑层和BaaS依赖层
工作原理
云函数之所以能做到按量计费和弹性扩容,与其实现机制是分不开的。核心原理是在函数被调用时才动态的启动容器实例去执行,容器的生命周期很短,执行完后一定时间就会被回收,所以没有调用时是不消耗任何资源的。而面对同一时间的并行调用,会启动多个实例来完成执行,这也实现了单个请求级别的弹性扩容,且理论上是可以无限扩容的。
由于容器启动本身需要耗时,所以一般的实现会在实例执行完之后保留一定时间窗口。大致的工作流程如下图,其中步骤(1) (2) (3) (4) 为冷启动调用流程,(5) 为非冷启动调用。

1.函数注册
用户在控制台(或命令行)提交函数代码到云平台,并进行函数配置。代码一般会被作为静态资源保存(如对象存储),而函数的元信息会被存入数据库中(如mysql)。
2.函数触发
云函数的触发可以分为同步和异步两种情况:
- 如果是同步请求则等待函数执行结果后返回
- 如果是异步请求则可以投递到队列后直接返回
3.函数执行
云函数的执行可以分为冷启动和非冷启动两种情况:
- 如果没有可用的实例资源则进入冷启动流程,需要进行宿主机调度,在宿主机拉起容器实例,下载函数代码,然后执行代码。
- 首次执行完毕后docker容器不会立即关闭,会等待一定时间周期,如果此时有新的请求进来,会被分配到该容器,直接运行代码。
冷启动问题
前面说到云函数的实现机制必须要在函数调用时才去启动运行环境,需要面临冷启动问题。虽然保留一定时间可以让后续的请求无需加载,但如果在极短时间内并发大量请求,还是会同时启动多个容器,影响首个请求的响应时间。前面也说到,云函数的特性和机制决定了它的应用场景,对于同时要求高并发、低时延的场景并不是特别适合。
对于冷启动问题,下面以腾讯云的云函数SCF为例进行验证。使用Postman的批量测试功能(Collection Runner)对云上部署的一个Hello World函数进行串行测试。

从图中可以看出,一段时间内的首次请求耗时会比其他请求的耗时高出一个数量级。
冷启动优化
冷启动的优化主要针对同步的请求,首先分析下冷启动耗时的组成,主要是容器的拉起和代码的下载(当然也有资源调度和网络配置等,这里暂不讨论)。
1.代码缓存:可以设计多级缓存,比如在宿主机上进行代码包缓存,以及在可用区(AZ)内部进行缓存,这样后续的首次启动就可以快速就近获取,而无需再次从对象存储下载。
2.容器预创建:一个优化思路就是预加载,也就是预测将会到来的请求,提前拉起容器实例,从而减少耗时。有以下几种可能的方案:
- 进行请求量的实时计算,如果请求呈上升趋势,就开始预创建容器实例,同理下降则进行回收。
- 云函数调用链: 这是一种可确定的预测,当云函数之间出现互相调用,在前面的函数被触发时就可以同时预创建调用链后面的实例;
- 版本更新: 如果函数版本进行更新,则之后的所有请求都会重新冷启动,为了避免这种情况,需要预创建一些实例并下载新版本代码,之后才能将流量平滑迁移到新版本函数。
应用场景
1.Rest API
利用云函数可以快速部署一个Rest API应用,目前的云厂商基本都支持大部分node,python和php的web框架,如koa、Express.js、Next.js、Flask、Django、Laravel等等。
这种web架构是前后端分离,即云函数中的后台接口只提供数据,页面的渲染在浏览器进行。可以将前端的代码部署到对象存储中,并使用相关云数据库作为数据存储,这就成为一个完整的云上Full Stack应用。
2.SSR
SSR(Server-Side Rendering):后端渲染,即页面直接在后台进行渲染,浏览器只负责显示。这种比较传统的web架构很适合应用于Serverless,只需将整个后端代码部署到云函数即可,好处有:1.利于SEO,2.降低系统复杂度,易于部署。
Serverless很适合用于流量分布不均的轻量应用,比如一些活动页面,可能一个周期内只有很短的一段时间会有大量访问,且需要长期的维护,此时为这个应用去购买高配置的服务器显然是不划算的。使用Serverless之后则可以完全解决这个问题,按量计费降低了成本,既免去了长期运维又不需要担心扩容问题。
3.任务执行
云函数本身是无状态的,所以天然适合无状态任务,如果需要状态存储则需要借助BaaS层的组件。云函数的优势是可以与云提供商下的其他服务(比如数据库、缓存、对象存储、CDN、AI、转码等)打通,在函数中使用SDK连接各个组件(但这同样意味着将在云产商绑定的道路上越走越远)。以下是一些适用场景:
消息通知:比如触发后向某个用户发送邮件、短信等。
定时任务:云函数一般提供定时器触发,方便进行定时任务的执行。
CDN自动刷新:一般来说会把图片、网页等静态资源存到对象存储,并且配置CDN加速,一旦资源发生修改还得手动进行CDN刷新预热。可以使用对象存储上传的事件触发器,在云函数中调用CDN接口自动化刷新预热。
视频转码:如果云产商提供转码服务,可以借助云函数很方便的完成转码任务。如原视频上传到对象存储后,该事件可以触发云函数调用转码服务,并将转码后的视频发布到对象存储中,如果使用了CDN还可以进行缓存刷新。
AI服务:可以使用云函数调用该产生的AI服务,比如调用OCR接口识别图片文字内容后返回。
Devops:例如将Github的webhook设置为云函数的地址,当代码提交后触发云函数,执行CI/CD任务,构建后发布产物到云服务器上。
具体产品
下面以腾讯云上的Serverless产品为例介绍具体的使用实践。
SCF云函数
SCF (Serveless Cloud Function)是腾讯云Serverless的核心产品,部署一个可以从公网访问的云函数只需简单两步:
1.函数编写:可以直接在控制台上的编辑器中编写函数代码,下图就是一个Hello World云函数:

2.创建触发器:如果想通过浏览器进行函数调用,则创建一个API网关触发器,会分配一个公网地址供访问。API网关还支持绑定自定义域名,可实现通过 "{自定义域名}/{函数名}" 的方式访问云函数,例如 http://apigw.zhayujie.com/test。

除了网关触发,SCF还支持对象存储(COS)、消息队列(Ckafka、CMQ)、定时任务等触发器,方便云函数与这些组件打通,可以衍生出很多应用场景。
Serverless Framework
Serverless framework是Serverless官方提供的标准化框架,目前支持该框架的产商有腾讯云、AWS、Azure、Google等等。其目的一是完善Serverless项目的devops流程,包括开发、测试、管理、部署、监控等生命周期;二是提供一个标准接口,降低serveless应用对云厂商的绑定,减小迁移成本。
对于简单的函数可以在控制台直接编写和部署,但对于有一定规模的项目肯定是不能满足的,我们不可能每次都在网页上手动修改代码,也不可能一一手动创建和管理所依赖的云产品。
于是Serverless framework提供了基于命令行和IDE的一站式开发部署,方便快速构建Serverless应用。且腾讯云将SCF、COS、CDN、数据库等BaaS层的云产品都抽象为组件(Serverless framework components),在应用中可以方便的对这些资源进行创建、配置和管理。
CloudBase
云开发CloudBase最初多用于为小程序提供BaaS能力,使开发者可以免于维护服务器,采用全托管的方式开发小程序,如今云开发还支持公众号、web应用、Flutter客户端等。
云开发其实提供了一体化的开发环境,集成了FaaS层的云函数和常用的BaaS层组件(NoSQL数据库,COS云存储),以及提供了监控和日志能力,基本涵盖了应用开发所需的核心环境和工具。
总结
本文首先介绍了Serverless的概念,可简单理解为FaaS和BaaS的结合,并阐述了其优势(免运维、按量计费、弹性伸缩),以及劣势(延时、复杂应用支持、云产商绑定)。
工作原理部分,介绍了云函数的工作流程,包括函数注册、函数触发、函数执行,分析了冷启动的问题,并提出了一些优化方案猜想(代码缓存、容器预创建)。
应用场景部分,对web应用托管(Rest API、SSR)和任务执行这两种常见应用场景提出了具体的实例。
最后介绍了腾讯云上的Serverless产品,包括SCF云函数、Serveless Framework、CloudBase云开发,其中使用SCF创建了一个可从公网访问的云函数demo。希望读完本文能对Serverless无服务架构有一个形象具体的认识。
本文链接: https://zhayujie.com/serverless-intro.html
Serverless无服务器架构详解的更多相关文章
- 无服务器架构(Faas/Serverless)
摘要无服务器架构(Faas/Serverless),是软件架构领域的热门话题. AWS,Google Cloud和Azure - 在无服务器上投入了大量资金,已经在看到了大量专门针对Faas/Serv ...
- Serverless架构详解:开发者如何专注于业务代码本身?
本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 演讲嘉宾:黄文俊,曾负责企业级存储.企业级容器平台等产品的架构与开发,目前主要负责SCF腾讯无服务器云函数产品相关. ...
- RESTful 架构详解
RESTful 架构详解 分类 编程技术 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次 ...
- Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务
一.分布式架构详解 1.分布式发展历程 1.1 单点集中式 特点:App.DB.FileServer都部署在一台机器上.并且访问请求量较少 1.2 应用服务和数据服务拆分 特点:App.DB.Fi ...
- 【菜鸟】RESTful 架构详解
RESTful 架构详解 分类 编程技术 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次 ...
- WeChatAPI 开源系统架构详解
WeChatAPI 开源系统架构详解 如果使用WeChatAPI,它扮演着什么样的角色? 从图中我们可以看到主要分为3个部分: 1.业务系统 2.WeChatAPI: WeChatWebAPI,主要是 ...
- Solr系列二:solr-部署详解(solr两种部署模式介绍、独立服务器模式详解、SolrCloud分布式集群模式详解)
一.solr两种部署模式介绍 Standalone Server 独立服务器模式:适用于数据规模不大的场景 SolrCloud 分布式集群模式:适用于数据规模大,高可靠.高可用.高并发的场景 二.独 ...
- Hyperledger Fabric架构详解
区块链开源实现HYPERLEDGER FABRIC架构详解 区块链开源实现HYPERLEDGER FABRIC架构详解 2018年5月26日 陶辉 Comments 10 Comments hyper ...
- B/S架构详解
学习笔记: * B/S架构详解 * 资源分类: 1. 静态资源: * 使用静态网页开发技术发布的资源. * 特点: ...
随机推荐
- 蜂鸟E203系列——Linux下运行hello world例程
欲观原文,请君移步 创建程序 在 -/hbird-e-sdk-master/software 路径下创建一个"helloworld"中文件夹 在 -/hbird-e-sdk-mas ...
- 数据可视化之powerBI入门(十二)PowerBI中最重要的函数:CALCULATE
https://zhuanlan.zhihu.com/p/64382849 介绍DAX的时候,特别强调过一个重要的函数:CALCULATE,本文就来揭秘这个函数的计算原理以及它是如何影响上下文的. C ...
- 数据可视化之powerBI技巧(二十三)Power BI可视化技巧,使用DAX自定义时间轴
按照自然日历来展现疫情数据时,是这样的效果, 由于各个国家的疫情爆发时间不一致,按自然日期坐标轴很难比较各个国家的蔓延速度. 如果各个国家都从蔓延日开始统计,展示之后每日的确诊人数,就是同样的时间轴 ...
- It's time for Django
本节内容 Django流程介绍 Django url Django view Django models Django template Django form Django admin Django ...
- 移除hmtl5 input type=“number”的step验证
设置 step="any"例如:<input type="number" step="any" value=""& ...
- Vue中token的实现
在学习vue的过程中,正好项目中做的web系统对安全性有要求 转载自https://www.jianshu.com/p/d1a3fb71eb99 总:通过axios,vuex,及自定义的方法实现.以下 ...
- HTML学习分享(一)
HTML学习小结(一) 1.css的全称是什么? 2.样式表的组成 3.浏览器读取编译css的顺序? (1)HTML基本选择器 1.通配符选择器 * { margin: 0; padding: 0; ...
- Ant-Design-Vue中关于Table组件的使用
1. 如何自定义表格列头: <a-table :columns="columns" :dataSource="dataSource"> <sp ...
- Ethical Hacking - Overview
Hacking is gaining unauthorized access to anything. Preparation Setting up a lab and installing need ...
- vue : history模式与项目部署的爬坑
需求:url不能有#符号,且不放在服务器虚拟主机的根目录. 假设放在虚拟主机的 medicine 文件夹下. 需要改两个文件,一个是 ./config/index.js (vue设置文件) ,另一个是 ...