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等能⼒。
特点及优势:
1. 免运维:⽆需管理基础设施 —> 可以专注业务开发
2. 按量计费:闲时不计费 —> 降低成本
3. 弹性伸缩:峰时⾃动扩容 —> ⽆需考虑可⽤性问题
劣势及适⽤场景:
1. 冷启动延迟: ⼀定时间内的⾸次调⽤可能需要冷启动(如进⾏加载代码、拉起容器等任务)—> 适合对响应速度要求不是太⾼的接
⼝,更适合异步任务,不适合启动耗时久的Java项⽬
2. 开发和管理设施: Serverless应⽤的调试、测试、排障、发布等设施暂不成熟 —> ⽬前更适合后端逻辑不太复杂的轻量级应⽤
3. 云产商绑定: 不同云产商提供的组件(如存储)接⼝不同,可能增加未来迁移成本 —> 使⽤标准化框架,并在设计时尽量隔离通⽤逻
辑层和BaaS依赖层
⼯作原理
云函数之所以能做到按量计费和弹性扩容,与其实现机制是分不开的。核⼼原理是在函数被调⽤时才动态的启动容器实例去执⾏,容器的⽣命周期很短,执⾏完后⼀定时间就会被回收,所以没有调⽤时是不消耗任何资源的。⽽⾯对同⼀时间的并⾏调⽤,会启动多个实例来完成执⾏,这也实现了单个请求级别的弹性扩容,且理论上是可以⽆限扩容的。
由于容器启动本⾝需要耗时,所以⼀般的实现会在实例执⾏完之后保留⼀定时间窗⼝。⼤致的⼯作流程如下图,其中步骤(1) (2) (3) (4)为冷启动调⽤流程,(5) 为⾮冷启动调⽤。
1.函数注册
⽤户在控制台(或命令⾏)提交函数代码到云平台,并进⾏函数配置。代码⼀般会被作为静态资源保存(如对象存储),⽽函数的元信息会被存⼊数据库中(如mysql)。
2.函数触发
云函数的触发可以分为同步和异步两种情况:
如果是同步请求则等待函数执⾏结果后返回
如果是异步请求则可以投递到队列后直接返回
3.函数执⾏
云函数的执⾏可以分为冷启动和⾮冷启动两种情况:
如果没有可⽤的实例资源则进⼊冷启动流程,需要进⾏宿主机调度,在宿主机拉起容器实例,下载函数代码,然后执⾏代码。
⾸次执⾏完毕后docker容器不会⽴即关闭,会等待⼀定时间周期,如果此时有新的请求进来,会被分
配到该容器,直接运⾏代码。
搭建ssr服务器教程冷启动问题
前⾯说到云函数的实现机制必须要在函数调⽤时才去启动运⾏环境,需要⾯临冷启动问题。虽然保留⼀定时间可以让后续的请求⽆需加载,但如果在极短时间内并发⼤量请求,还是会同时启动多个容器,影响⾸个请求的响应时间。前⾯也说到,云函数的特性和机制决定了它的应⽤场景,对于同时要求⾼并发、低时延的场景并不是特别适合。
对于冷启动问题,下⾯以腾讯云的为例进⾏验证。使⽤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云函数
是腾讯云Serverless的核⼼产品,部署⼀个可以从公⽹访问的云函数只需简单两步:
1.函数编写:可以直接在控制台上的编辑器中编写函数代码,下图就是⼀个Hello World云函数:
除了⽹关触发,SCF还⽀持对象存储(COS)、消息队列(Ckafka、CMQ)、定时任务等触发器,⽅便云函数与这些组件打通,可以衍⽣出很多应⽤场景。
Serverless Framework
是Serverless官⽅提供的标准化框架,⽬前⽀持该框架的产商有腾讯云、AWS、Azure、Google等等。其⽬的⼀是完善Serverless项⽬的devops流程,包括开发、测试、管理、部署、监控等⽣命周期;⼆是提供⼀个标准接⼝,降低serveless应⽤对云⼚商的绑定,减⼩迁移成本。
对于简单的函数可以在控制台直接编写和部署,但对于有⼀定规模的项⽬肯定是不能满⾜的,我们不可能每次都在⽹页上⼿动修改代码,也不可能⼀⼀⼿动创建和管理所依赖的云产品。
于是Serverless framework提供了基于命令⾏和IDE的⼀站式开发部署,⽅便快速构建Serverless应⽤。且腾讯云将SCF、COS、CDN、数据库等BaaS层的云产品都抽象为组件(Serverless framework components),在应⽤中可以⽅便的对这些资源进⾏创建、配置和管理。
CloudBase
最初多⽤于为⼩程序提供BaaS能⼒,使开发者可以免于维护服务器,采⽤全托管的⽅式开发⼩程序,如今云开发还⽀持、web应⽤、Flutter客户端等。
云开发其实提供了⼀体化的开发环境,集成了FaaS层的云函数和常⽤的BaaS层组件(NoSQL数据库,COS云存储),以及提供了监控和⽇志能⼒,基本涵盖了应⽤开发所需的核⼼环境和⼯具。
总结
本⽂⾸先介绍了Serverless的概念,可简单理解为FaaS和BaaS的结合,并阐述了其优势(免运维、按量计费、弹性伸缩),以及劣势(延时、复杂应⽤⽀持、云产商绑定)。
⼯作原理部分,介绍了云函数的⼯作流程,包括函数注册、函数触发、函数执⾏,分析了冷启动的问题,并提出了⼀些优化⽅案猜想(代码缓存、容器预创建)。
应⽤场景部分,对web应⽤托管(Rest API、SSR)和任务执⾏这两种常见应⽤场景提出了具体的实例。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。