追本溯源,详解Serverless架构及应用

Serverless指的是由开发者实现的服务端逻辑运行在无状态的计算容器中,它由事件触发, 完全被第三方管理,其业务层面的状态则被开发者使用的数据库和存储资源所记录。

以上图1为例,图中上半部分描述的是互联网应用传统架构的模型:用户客户端APP与部署在服务器端的常驻进程通信,服务端进程处理该应用的大部分业务逻辑流程。下半部分则描述了Serverless架构模型。与传统架构模型最大的不同在于,互联网应用的大部分业务逻辑流程被转移到客户端上,客户端通过调用第三方服务接口来完成诸如登录,鉴权,读取数据库等通用业务场景;高度定制化的业务逻辑则通过调用第三方FaaS平台执行自定义代码来完成。总体上看,Serverless架构将传统架构中的服务器端的整串总体流程拆分成在客户端上执行一个个第三方服务调用或FaaS调用。

回顾之前所述,无论是直接使用物理服务器设备部署程序,还是基于IaaS平台托管硬件,或者使用PaaS平台托管应用,开发部署互联网应用都离不开传统的客户端-服务器模式,即客户端向服务端发送请求,服务器运行处理各种业务逻辑,并响应来自客户端的请求。至于物理机,IaaS乃至PaaS,归根结底只是服务器程序的部署模式不同。

而在Serverless架构中,软件开发者和运维工程师们不在需要关心服务器的部署,架设,伸缩,这些问题交给云平台商来解决,程序员们得以将精力投入用代码来实现业务逻辑中,而不是管理服务器。Serverless并不意味着不再需要服务器了,只是服务器资源的申请,使用,调度伸缩由云服务商自动实现,应用开发者无需关心。

Serverless如何工作?

以一个简单需求为例,论坛网站需要对用户上传的图片生成一个缩略图。

我们使用我们自研的通用计算(UGC)来实现该功能。

架构详解2

图2:UGC上传图片生成一个缩略图

如上图2所示,使用UGC实现这一功能操作步骤如下:

1.用户将缩略图算法代码打包推送到UGC算法仓库中。

2.用户从UFile中读取原始图片作为输入数据,调用UGC

3.SubmitTask API,指定缩略图算法,执行缩略图转换任务。

4.UGC平台执行缩略图转换算法,将转换后的缩略图返回给用户。

用户将得到的结果缩略图存储到UFile中。

整个过程中,开发者仅仅需要将缩略图算法实现函数代码镜像提交到UGC算法仓库中,然后调用UGC的提交任务API,输入源图片数据,即可获得计算结果。

从以上过程可以总结出:使用Serverless,开发者无需考虑服务器细节,只需要负责编写发生某些事件后所需执行的代码。云供应商将负责提供用于运行这些代码的服务器,并在必要时对服务器进行缩放。执行完毕后,承担这些功能的容器会立刻停用,用户只需为运行代码过程中所消耗的资源付费。这种模式也被称为做函数即服务(Function-as-a-Service,FaaS)。

与非Serverless方案的对比

上述场景如果使用非Serverless方案,大体架构如下图3所示:

架构详解3

图3:非Serverless方案架构图

该方案需要维护一组UHost服务集群,服务器中部署图片缩略转换程序。UHost的服务程序先从UFile中读取源图片,使用图形库将其转换成缩略图并再存回UFile中。相比之前的Serverless方案,有以下几点对比:

开发者需要关心服务器端程序开发设计,将图片处理程序部署成服务端程序,并购置服务器部署并运维管理这批UHost服务器。而使用UGC,开发者无需关注服务器端,只需要将图形库函数提交到UGC算法仓库中并调用UGC API完成计算任务即可。

UHost集群无法自动为突发流量自动伸缩扩容,需要运维工程师手动购置更多的UHost并部署上线扩容。而UGC能根据突发的流量自动伸缩,运行更多的函数容器。

UHost服务器只要在运行就必须为之付费,无论请求量和负载的高低。UGC只需要为实际的调用次数和函数实际执行时间付费,真正实现了按需分配付费。