Serverless架构详解:开发者如何专一于业务代码自己?

**本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 **前端

演讲嘉宾:黄文俊,曾负责企业级存储、企业级容器平台等产品的架构与开发,目前主要负责SCF腾讯无服务器云函数产品相关。对容器平台、微服务架构、无服务器架构以及DevOps等多种热门技术领域均有涉猎。程序员

你们好,自我介绍一下,目前我是腾讯云无服务器云函数产品负责人。我作了不少年后端开发。今天是从一个程序员角度讲解一下咱们怎么样用Serverless架构。数据库

我将本次讲解分为几块:第一,Serverless架构介绍;第二,对云函数产品介绍;第三,Serverless使用场景。小程序

讲Serverless架构以前咱们能够来看一下整个云的发展过程,在没有云以前你们可能都是用的物理服务器,早期时候你们都用的物理机托管方式,采购一些服务器在机房里托管,这个时候你们前期要选择物理机型号,要作好IDC网络;若是出了问题还要请IDC人员帮你操做。这些设备的投入和运维成本仍是很高的。后端

云时代到来以后,因为虚拟化技术的运用,咱们用上了云主机。云主机是你们直接在云上作虚拟机购买,开通就可使用。这时候咱们称之为IaaS(基础设施即服务),这种状况下就无需物理机运营,直接放到云平台来作。而以后随着容器技术的发展,咱们有了容器平台,或者叫PaaS(平台即服务)。在容器平台到来以后实际上还存在一部分基础设施运维问题,可是这时候基础设施逐渐下沉到运维人员进行操做;而从应用开发者角度来看,他们已经不用再去关心虚拟机,或者操做系统。在这种状况下,应用开发人员更多的去关注应用所须要的计算资源或者存储资源的使用。继续向前发展,咱们到了FaaS(函数即服务)。这时候运维人员不须要关注底层的运维,而是按需运行的能力。业务开发人员可以进一步作与业务相关的事情。浏览器

接下来咱们来看一下Serverless架构是什么。Serverless从物理机或虚拟机的使用上进行了分离,更关注上层业务的运行状况。Serverless架构包含两块:函数即服务和后端即服务。函数即服务提供的是计算能力。原有的计算能力,不管是容器也好,虚拟机也好都承载在必定的操做系统之上,函数即服务把计算能力进行了进一步抽象,咱们在后文再继续进行展开。另外,Serverless还有后端即服务,好比对象存储,数据库应用,缓存服务,咱们也能够称之为Serverless,由于这些服务也可以在云上提供开通即服务,开通即便用的能力。在使用这些产品时一样不须要关注它的服务器是什么样的,它的服务器部署在哪里,而是服务开通就可使用了,后面的运维工做都交给了云,因此不用感知它的最底层服务器,所以咱们也能够把它称之为Serverless。这种服务就称之为Serverless后端即服务。这两个合起来能够称为Serverless架构。缓存

img

函数即服务的工做原理是什么样的?在Serverless上是怎样提供计算能力的?你们原来使用容器或者虚拟机的时候均可以知道,咱们把代码上传到容器或者上传到虚拟机,而后启动一个进程,代码就能够运行,它就能够接受外部的请求,作一些实时的响应。Serverless和原有的容器或虚拟机不一样,实现的是计算托管服务,Serverless用户首先要作的,是把咱们称为云函数的代码,提交到平台上进行代码托管;而后要作的是配置触发器。为何须要配置触发器?由于云函数的运行方式是触发式运行,有触发的时候,代码才会真正运行起来。因此配置触发器意味着咱们给它设置了一个触发源,也就是定义了在什么事件下代码才真正运行起来。用户代码托管到平台以后,事件没有到来以前,它仅仅是代码文件和配置存储,代码并无运行。什么状况下运行?是当事件触发真正到来的时候,云函数才会真正启动一个实例,这个实例就意味着一个计算单元。计算单元被拉起后,这个事件就被传到这个计算单元中进行计算处理。若是这个触发源的事件不少,并发很高的状况下,平台会根据事件的堆积状况,或者事件到达的速度,自动把同一份代码和配置拉起多个实例进行并发处理。所以能够看到Serverless的运行是按需运行,意味着只有在事件到来的状况下,代码才会被拉起,才会运行起来。安全

img

自动并发,是指云函数平台会根据事件堆积状况自动的进行并发,自动拉起多个实例进行处理。而原有的容器或者虚拟机若是要进行并发的话仍是要有必定的手工参与,好比启动更多的容器,或者加入更多的虚拟机来承载高并发的请求。而函数即服务是彻底自动的运行。服务器

按需运行带来的另一个特色,是代码在运行起来以后上才会占用计算资源。函数即服务的费用也是根据按需运行来的,也就是函数运行的时候才进行计费;而没有使用的状况下不会计费。实际上大多数互联网业务只有白天的时候,甚至六点以后你们下班以后业务才会迎来高峰,而到凌晨以后实际上没有多少请求的,所以函数即服务可以很好的知足波峰波谷来削峰填谷的能力。网络

img

从上面的原理能够看出函数即服务的一些特色,好比说代码托管,云函数平台所提供的直接就是运行环境,也就是支持各类开发语言的环境;对于开发者或者函数服务使用者来讲,并无感知到它下面的服务器在哪里,而是由函数平台完成了函数运行的调度。所以实际来说不须要运维,包括操做系统优化,服务器维护等等这些都是由平台进行承载。

而秒级部署意味着函数在真正的被请求的时候才运行。而这个请求才运行表明着当请求到达平台的时候函数才会被实时拉起并运行。运行完成后若是没有后续请求,实例也会退还。

因为函数运行是事件触发的,而事件其实包含不少种类,有各类触发器均可以对接云函数。有越多的触发器对接,云函数所能提供的场景也就越多。

对于开发者来讲,使用云函数的状况下,他真正关注的是应该业务,是使用代码去聚焦他的业务逻辑,例如是拿到这个事件后该进行什么样的逻辑操做,进行什么样的业务存储,而不须要去关注怎么使用业务代码实现高并发,怎么样实现高请求的承载能力。所以这里看到函数即服务可以为应用开发者带来一些便利,而自动并发自己也是函数即服务所具备的特色。

img

而对于腾讯云无服务器云函数,在最开始开发产品的时候,咱们目标也是同样,就是把计算进行托管。在计算托管的状况下,咱们使用计算就像咱们使用腾讯云对象存储同样,在使用的时候不用关心最底层的运维,不用关心虚拟机或者物理机是否安全。和对象存储进行对比也能看到,咱们计算也是按照实际使用状况进行计费。固然如今云函数还处于免费期,你们能够随时使用。

从使用方法来讲,云函数自己,或者说函数即服务这种产品自己的使用方法都是很简单的。咱们在开发的时候更多的关注于核心代码的编写。核心代码的意思实际上就是真正的业务逻辑。并且业务逻辑里不须要考虑高并发,由于由刚才给出来的函数即服务这种计算特色来看的话,在高并发请求的时候是经过多个实例处理进行,所以业务代码在编写的时候,就关注单个事件的处理就行。所以,第一步的核心的就是编写核心业务代码,就是用代码要实现什么样的业务。后续就是配置触发方式。配置触发方式就是把函数代码和触发源对接起来。和云平台上其余的产品进行对接,须要什么样的事件,处理什么样的事件,进行什么样的逻辑处理,作好这样的触发源对接后,函数就可以在事件产生的状况下运行。

img

所以,从整个使用方法来看的话,你们真正要作的是两步:第一,编写代码,第二,配置好触发。而对于底层的基础设施,环境配置这块都不须要你们操心的。

img

目前,腾讯云函数从运行环境来讲目前已经支持了Python、Nodejs、PHP、Golang、Java等语言的开发运行环境。

接下来是触发器,由于触发器越多,云函数所能去使用的场景其实也越多,咱们已经实现的触发器有定时触发器;腾讯云对象存储服务,包括文件的上传、删除等时间;CMQ 消息队列服务;API 网关服务,这个是经过serverless 架构实现 API 服务的一款重要触发器;另外,还有ckafka,这个是腾讯云提供的kafka能力。目前kafka算是一个开源产品,咱们腾讯云把它包装后放到云上来,也是兼容标准的kafka协议。所以在不少状况下直接迁移到腾讯云不须要任何修改。由于kafka自己做为消息传递的载体,跟腾讯原有的消息队列相似,由消息来执行云函数。

img

下面介绍一下在什么场景下Serverless能够落地?第一,在Serverless场景中最经常使用到的就是API服务。你们知道实现一个API服务,不管是把API给到浏览器应用,仍是给到手机APP使用,仍是给到小程序应用,给到它们的时候是以API实现的。要实现这个要有WEB服务器接收链接,对接后端的业务代码,若是你要再进行文件存储,后端的结构化存储,或者有一些缓存须要读写,你的应用服务器后面可能还要对接相应的文件存储,结构化数据库,后续若是想使用缓存,再对接到相应的服务器或相应产品。若是把现有的API服务向Serverless架构演进,那么它将怎么样呈现呢?

在不改变 API 的状况下,它的前端浏览器应用、APP、小程序,均可以无缝对接上来。而使用API网关来承接 API 请求,当这个请求来到API网关,由它转发给云函数,触发云函数执行。云函数执行时运行业务逻辑。实际上云函数运行时要求无状态,所以这样的状态存储也须要用到后面的一些存储,不管作缓存也好仍是数据库也好都要用上。所以,云上提供的产品同样能够进行对接。像文件存储的话能够用对象存储来进行。数据库的话同样的有相应的数据库产品,结构化仍是非结构化数据库都有相应的产品可使用。一样的,缓存也有相应的产品作对接。云函数经过代码编写,直接进行数据库的读写,或者缓存的读写都是能够的。

img

从整个服务架构来看的话,咱们使用最前面的API网关,提供是API能力,甚至进一步可以直提供有SDK服务,更加的方便开发。SDK提供了各类开发语言来直接进行API调用。云函数在中间起到的是业务逻辑处理的做用,而状态数据或者其余业务数据的存储是依赖于后面的文件存储或者数据库进行的。API服务也是Serverless最经常使用的一种落地形式。

img

这里介绍的场景,都是咱们客户在实际使用的场景。在 serverless落地场景中,对对象文件的处理也很常见。对象文件处理指的是对对象文件进行操做后的回调处理。回调一般是在对象文件建立或删除操做后产生的事件。云函数能够在获取到这个事件后进行后续的处理。这里常见的处理逻辑是下面几种,好比说图片处理,针对图片去生成各类尺寸的缩略图或者进行裁剪,而后再次存储到对象存储数据中,以后能够根据不一样客户端的请求展现不一样大小的图片到前端。

文件批量打包,用户须要进行文件筛选和打包的时候能够经过使用云函数来处理。在上传文件后,若是须要选择哪些文件来打包,把文件生成压缩包以供下载,这均可以由事件处理来进行。

日志归档分析,以及业务系统回调,也是云函数所承载的业务逻辑。好比说日志归档分析这种用法,用户会把天天的前端应用服务器的日志上传到对象存储中归档,归档后会触发云函数执行,云函数会拉下这些日志文件进行实时分析,它会抽取这些日志中的错误数,或者是其余业务相关或者用户关注的内容,而后再把它抽取到的信息或者统计到的信息写回数据库,供用户后续进行排查、使用。用户自身API调用也是,例如用户生成的一些视频文件上传到对象存储,会触发云函数,将上传文件的信息通知到用户的转码系统,经过视频转码转成不一样分辨率而后再进行存储。固然转码是用户自身实现的业务系统,这块经过回调通知,通知它自身的业务系统。这些就是云函数在Serverless架构和对象存储连用的落地场景。

img

再就是CKafka消息处理。CKafka目前比较多的应用场景是作日志存储和日志搜集,例若有多台应用服务器在不断产生日志的状况下,能够把日志写到CKafka,而后CKafka再进行归档和后续分析。而 CKafka和云函数对接是由CKafka收到的信息来进行触发的。日志搜集后,要归档的日志,通常存储到对象存储当中。这种状况CKafka消息,会被推送给云函数,云函数再再把这些消息写到对象存储中去。有些用户不是写对象存储,而是写数据库,以数据库形式归档,其实也是同样的。有的使用场景,须要进行消息分析,会实时拿到消息后马上分析里面的关键字,若是捕捉到了关键字,会马上把这些消息推送到ckafka 的另外一个topic 中,去及时的发出告警给到业务和运维人员。这也是 serverless 的一种用法,就是对消息的分析和转发。

img

消息队列和CKafka相似,可是消息队列通常不是进行日志的搜集,而是进行业务解耦。消息队列 CMQ 是腾讯云提供的一个高可靠金融级消息队列,一般进行一些业务级消息转发和处理。使用这个产品,实际上作的是业务解耦。云函数在这里承载着消息的逻辑处理过程,它可以在接收到消息后对消息马上进行业务处理。这个业务处理就是实际的业务逻辑,好比我要根据里面某个消息进行判断,判断它是否合适,要不要进行后续的转发,或者转发到另外的业务系统中去?这就是业务之间执行的逻辑。

同时,咱们也可使用云函数,再次进行消息的分派,作状态转移。这个状态转移和后面消息转发都是同样的,它会识别消息里的内容,根据消息里的内容进行转发。这种状况下相似于咱们使用云函数进行逻辑处理,把它转移到合适的消息队列,而后再进行处理。这也是咱们所见过直接用云函数进行消息派发的使用方式。

img

最后一种形式如今也很多,就是利用定时器触发。本来你们更可能是在运维场景下使用定时任务,在原有使用 crontab 脚本的状况下,你们一般还要关心脚本运行是否成功,这台虚拟机是否还在工做。云函数抛弃了你们使用传统的虚拟机或者物理机来去写crontab脚本还要确保可靠性的问题。而在实际使用定时器触发的场景下,这里也有几种用法:一种是业务拨测。这个是周期性的去拨测业务是否还在工做,若是出现异常的状况下可以及时的发出告警,发出邮件或者短信告诉到运维或开发人员。

另外一个是定时备份,这个是在所须要的周期内,好比天天,或者每两天对数据库进行备份,针对数据库须要作数据导出,导出后再将导出内容以文件的形式存储到合适的地方,例如对象存储中,作好定时备份。

还有一个是定时数据计算。由于有些计算是根据一段时间内的统计以后,进行计算并展现。在实际场景中,咱们腾讯云内部有业务就是在进行定时数据计算,每两小时作一次统计,而后再把统计数据写到数据库作后续业务的展现以及业务分析。

img

总结:Serverless架构自己给用户带来什么?它实际上就是容许咱们更关注业务代码,所以能够更快速的构建业务而后上线。如今互联网开发速度愈来愈快,所以你们指望的是进一步加快开发和业务真正上线的速度,提升迭代的能力。所以,使用Serverless的话能够更快速让业务上线,让咱们更快实现咱们的想法。而按需使用是咱们这个业务在上线以后,在真正产生请求后,业务才会被调动触发,才会有计算。而若是你的业务产生了爆发式增加,其实也不须要担忧平台承载能力或者业务扩展是否跟得上,由于平台提供自动扩展能力,下降了你们对运维的诉求,你们不用关心很底层的东西,而运维人员也能够更偏重流程化和业务相关的运维。这就是Serverless架构给你们带来的一些好处。而做为Serverless里的核心,函数即服务这种产品,是Serverless中所呈现出来的计算型的组件,你们也能够看到它和触发源和后端的各类产品或服务有紧密关联,它能够更多的被看作是云时代的脚本,相似于黏合剂,把前面的触发源和后端的各类存储,数据,服务进行了黏合,真正实现架构落地,才是真正实现业务逻辑落地的能力。

Q&A

Q:云函数有无限扩展能力,可是整个系统也有多是有限制的,好比它的背后的数据库和存储,我能不能设这样的一个扩展上限?

A:这能够设置上限的。目前能够经过提交工单的方式来设置指望的合适上限。扩展能够在后台设置一个合适值,并发实例扩展到这个就不会再扩展了,避免大量实例链接形成后端的数据库或存储超过链接数限制。

Q:实现 API 服务有哪些开发方式?

A:云函数实现 API 服务的开发方式有好几种,一个是所有在一个函数里完成,路径和方法解析都在函数里进行。这也是偏传统的开发方式。另一种是进行拆解,每一个函数处理一个 API 路径和方法的请求,这种是微服务的开发方式。

而函数和函数之间调用也是能够实现。一种是直接使用云API,一种是使用 API网关包装后的 API。云函数被触发调用的话,除了介绍的不少触发器,在不使用这些触发器的状况下,经过代码或者脚本也能够经过腾讯云的云API调用。

Q:在事件触发的时候,就是CMQ事件触发的时候,是否能够保证函数被执行呢?由于不像API网关,调用一下函数能够启动,前端能够感知到。可是CMQ,就是扔到消息队列可否保证这个函数被执行呢?

A:由于不像API网关是同步调用。同步调用就是这个调用在运行过程当中若是出了问题,不管是平台,好比说资源不足,并发不够,或者好比使用的超时了,这个时候能够马上感知到。 而像CMQ或者CKafka都是异步的,这样意味着调用后你感知不到,这个消息何时执行,执行结果都无法感知。这种解决方法有两种:一种是函数运行后的结果输出,把消息处理后的输出结果再放到另外一个消息队列中去,让你外部的业务系统可以感知到。固然这种对外通知也是异步通知。同步通知是另一种,就是函数里能够对自身业务进行回调API,能够经过代码知道如今的数据处理是什么样的结果,处理完后能够马上回调到API让业务系统接收处处理结果。

Q:像COS触发,拿视频转码来讲,这个有可能在300秒内处理不完。如今函数设置时间只能最高300秒,这个有什么解决方案吗?

A:为何各家的云平台,都把这个时间大体定在这个范围内,就是不但愿在云函数中进行过重的计算。视频转码就属于过重的计算,而云函数提供的包括CPU能力,内存大小都有限,实际上都不太适合在云函数内进行转码。实际上能够用一些视频服务来实现转码,使用云函数来作这二者之间的桥梁,例如对象存储的事件触发后,云函数拿到这个事件经过调用视频转码服务来转码,而不是在云函数转码。目前腾讯云有这个服务,你能够试试看。

获取更多详细资料,请戳如下连接:

Serverless 架构.pdf

问答
serverless:如何删除一个函数?

相关阅读

让业务感知不到服务器的存在——基于弹性计算的无服务器化实践

使用 SCF 无服务器云函数定时备份数据库

云学院 · 课程推荐 | 腾讯专项技术测试组长,结合8年经验为你细说冷热分离法则

**此文已由做者受权腾讯云+社区发布,原文请点击 **

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

相关文章
相关标签/搜索