云计算涌现出很多改变传统IT架构囷运维方式的新技术比如虚拟机、容器、微服务。无论这些技术应用在哪些场景“降低成本、提升效率”是云服务永恒的主题。
过去┿年来我们已经把应用和环境中很多通用的部分变成了服务。serverless 为什么less的出现带来了跨越式变革。serverless 为什么less把“主机管理、操作系统管理、资源分配、扩容”甚至是“应用逻辑的全部组件”都外包出去,把它们看作某种形式的商品——厂商提供服务我们掏钱购买。
过去昰“构建一个框架运行在一台服务器上对多个事件进行响应”;serverless 为什么less则变为“构建或使用一个微服务或微功能来响应一个事件”,真囸实现:当访问时调入相关资源开始运行;运行完成后,卸载所有开销;真正做到按需按次计费这是云计算向纵深发展的一种自然而嘫的过程。
serverless 为什么less是一种构建和管理基于微服务架构的完整流程允许你在服务部署级别而不是服务器部署级别来管理你的应用部署。它與传统架构的不同之处在于:完全由第三方管理由事件触发,存在于无状态(Stateless)、暂存(可能只存在于一次调用的过程中)计算容器内“构建无服务器应用程序”意味着:开发者可以专注在产品代码上,而无须管理和操作云端或本地的服务器或运行时serverless 为什么less真正做到叻“部署应用无需涉及基础设施的建设,自动构建、部署和启动服务”
国内外的各大云厂商 Amazon、微软、Google、IBM、阿里云、腾讯云、华为云相继嶊出serverless 为什么less产品,serverless 为什么less也从概念、愿景逐步走向落地在各企业、公司应用开来。
serverless 为什么less由开发者实现的服务端逻辑运行在无状态的计算容器中它由事件触发, 完全被第三方管理其业务层面的状态则被开发者使用的数据库和存储资源所记录。serverless 为什么less涵盖了很多技术汾为两类:FaaS和BaaS。
FaaS意在:无须自行管理服务器系统或自己的服务器应用程序即可直接运行后端代码。其中所指的服务器应用程序是该技術与容器和PaaS(平台即服务)等其他现代化架构最大的差异。
FaaS可以取代一些服务处理服务器(可能是物理计算机但绝对需要运行某种应用程序),这样不仅不需要自行供应服务器也不需要全时运行应用程序。
FaaS产品不要求必须使用特定框架或库进行开发在语言和环境方面,FaaS函数就是常规的应用程序例如AWS
Lambda的函数可以通过Javascript、Python以及任何JVM语言(Java、Clojure、Scala)等实现。然而Lambda函数也可以执行任何捆绑有所需部署构件的进程,因此可以使用任何语言只要能编译为Unix进程即可。FaaS函数在架构方面确实存在一定的局限尤其是在状态和执行时间方面。
在迁往FaaS的过程中唯一需要修改的代码是“主方法/启动”代码,其中可能需要删除顶级消息处理程序的相关代码(“消息监听器接口”的实现)但這可能只需要更改方法签名即可。在FaaS的世界中代码的其余所有部分(例如向数据库执行写入的代码)无须任何变化。
相比传统系统部署方法会有较大变化 – 将代码上传至FaaS供应商,其他事情均可由供应商完成目前这种方式通常意味着需要上传代码的全新定义(例如上传zip戓JAR文件),随后调用一个专有API发起更新过程
FaaS中的函数可以通过供应商定义的事件类型触发。对于亚马逊AWS此类触发事件可以包括S3(文件)更新、时间(计划任务),以及加入消息总线的消息(例如Kinesis)通常,你的函数需要通过参数指定自己需要绑定到的事件源
大部分供應商还允许函数作为对传入Http请求的响应来触发,通常这类请求来自某种该类型的API网关(例如AWS API网关、Webtask)
BaaS(Backend as a Service,后端即服务)是指我们不再编寫或管理所有服务端组件可以使用领域通用的远程组件(而不是进程内的库)来提供服务。理解BaaS需要搞清楚它与PaaS的区别。
首先BaaS并非PaaS咜们的区别在于:PaaS需要参与应用的生命周期管理,BaaS则仅仅提供应用依赖的第三方服务典型的PaaS平台需要提供方法,让开发者部署和配置应鼡例如自动将应用部署到Tomcat容器中,并管理应用的生命周期BaaS不包含这些内容,BaaS只以API的方式提供应用依赖的后端服务例如数据库和对象存储。BaaS可以是公共云服务商提供的也可以是第三方厂商提供的。其次从功能上讲BaaS可以看作PaaS的一个子集,即提供第三方依赖组件的部分
BaaS服务还允许我们依赖其他人已经实现的应用逻辑。对于这点认证就是一个很好的例子。很多应用都要自己编写实现注册、登录、密码管理等逻辑的代码而对于不同的应用这些代码往往大同小异。完全可以把这些重复性的工作提取出来再做成外部服务,而这正是Auth0和Amazon Cognito等產品的目标它们能实现全面的认证和用户管理,开发团队再也不用自己编写或者管理实现这些功能的代码
与使用虚拟机或一些底层的技术来部署和管理应用程序相比,无服务器计算提供了一种更高级别的抽象因为它们有不同的抽象和“触发器”的集合。
拿计算来讲這种抽象有一个特定函数和抽象的触发器,它通常是一个事件以数据库为例,这种抽象也许是一个表而触发器相当于表的查询或搜索,或者通过在表中做一些事情而生成的事件
比如一款手机游戏,允许用户在不同的平台上为全球顶级玩家使用高分数表当请求此信息時,请求从应用程序到API接口API接口或许会触发AWS的Lambda函数,或者无服务器函数这些函数再从数据库表中获取到数据流,返回包含前五名分数嘚一定格式的数据
一旦构建完成,应用程序的功能就可以在基于移动和基于Web的游戏版本中重用
这跟设置服务器不同,不是必须要有Amazon EC2实唎或服务器然后等待请求。环境由事件触发而响应事件所需的逻辑只在响应时执行。这意味着运行函数的资源只有在函数运行时被創建,产生一种非常高效的方法来构建应用程序
在现阶段,serverless 为什么less主要应用在以下几个场景首先,在Web及移动端服务中可以整合API网关囷serverless 为什么les服务构建Web及移动后端,帮助开发者构建可弹性扩展、高可用的移动或
Web后端应用服务在IoT场景下,可高效的处理实时流数据由设備产生海量的实时信息流数据,通过serverless 为什么les服务分类处理并写入后端处理。另外在实时媒体资讯内容处理场景里,用户上传的音视频箌对象存储OBS通过上传事件触发多个函数,分别完成高清转码、音频转码等功能满足用户对实时性和并发能力的高要求。无服务器计算還适合于任何事件驱动的各种不同的用例这包括物联网,移动应用基于网络的应用程序和聊天机器人等。这里简单说两个场景方便夶家思考。
4.1 场景一:应用负载有显著的波峰波谷
serverless 为什么less 应用成功与否的评判标准并不是公司规模的大小而是其业务背后的具体技术问题,比如业务波峰波谷明显如何实现削峰填谷。一个公司的业务负载具有波峰波谷时机器资源要按照峰值需求预估;而在波谷时期,机器利用率则明显下降因为不能进行资源复用而导致浪费。
业界普遍共识是当自有机器的利用率小于30%,使用 serverless 为什么less
后会有显著的效率提升对于云服务厂商,在具备了足够多的用户之后各种波峰波谷叠加后平稳化,聚合之后资源复用性更高比如,外卖企业负载高峰是茬用餐时期安防行业的负载高峰则是夜间,这是受各个企业业务定位所限的而对于一个成熟的云服务厂商,如果其平台足够大用户足够多,是不应该有明显的波峰波谷现象的
4.2 场景二:典型用例 - 基于事件的数据处理
视频处理的后端系统,常见功能需求如下:视频转码、抽取数据、人脸识别等这些均为通用计算任务,可由函数计算执行
开发者需要自己写出实现逻辑,再将任务按照控制流连接起来烸个任务的具体执行由云厂商来负责。如此开发变得更便捷,并且构建的系统天然高可用、实时弹性伸缩用户不需要关心机器层面问題。
对于企业来说支持serverless 为什么less计算的平台,一方面可以节省大量时间和成本同时可以释放员工,让开发者得以开展更有价值的工作洏不是管理基础设施。另一方面可以提高敏捷度,更快速地推出新应用和新服务进而提高客户满意度。但是serverless 为什么less不是完美的,它吔存在一些问题需要慎重应用在生产环境。
5.1 不适合长时间运行应用
serverless 为什么less 在请求到来时才运行这意味着,当应用不运行的时候就会進入 “休眠状态”;下次当请求来临时,应用将会需要一个启动时间即冷启动时间。如果你的应用需要一直长期不间断的运行、处理大量的请求那么你可能就不适合采用 serverless 为什么less 架构。如果你通过 CRON 的方式或者 CloudWatch
来定期唤醒应用又会比较消耗资源。这就需要我们对它做优化如果频繁调用,这个资源将会常驻内存第一次冷启之后,就可以一直服务直到一段时间内没有新的调用请求进来,则会转入“休眠”状态甚至被回收,从而不消耗任何资源
5.2 完全依赖于第三方服务
当你所在的企业云环境已经有大量的基础设施的时候,serverless 为什么less 对于你來说并不是一个好东西。当我们采用某云服务厂商的 serverless 为什么less 架构时我们就和该服务供应商绑定了,那么我们再将服务迁到别的云服务商上就没有那么容易了
我们需要修改一系列的底层代码,能采取的应对方案便是建立隔离层。这意味着在设计应用的时候,就需要隔离 API 网关、隔离数据库层考虑到市面上还没有成熟的 ORM 工具,让你既支持Firebase又支持 DynamoDB等等。这些也将带给我们一些额外的成本可能带来的問题会比解决的问题还要多。
5.3 缺乏调试和开发工具
当我使用 serverless 为什么less Framework 的时候遇到了这样的问题:缺乏调试和开发工具。后来我发现了serverless 为什么less-offline、dynamodb-local 等一系列插件之后,问题有一些改善然而,对于日志系统来说这仍然是一个艰巨的挑战。
每次你调试的时候你需要一遍又一遍地上传代码。而每次上传的时候你就好像是在部署服务器,并不能总是快速地定位出问题在哪后来,找了一个类似于 log4j 这样的可以分級别记录日志的 Node.js 库 winston它可以支持 error、warn、info、verbose、debug、silly 六个不同级别的日志,再结合大数据进行日志分析过滤才能快速定位问题。
serverless 为什么less 很便宜泹是这并不意味着它很简单。AWS Lambda的 CloudFormation配置是如此的复杂并且难以阅读及编写(JSON 格式),虽然CloudFomation提供了Template模板但是若要使用它,首先需要创建一個Stack在Stack中指定你要使用的Template,然后aws才会按照Template中的定义来创建及初始化资源
而serverless 为什么less Framework的配置更加简单,采用的是 YAML 格式在部署的时候,serverless 为什麼less Framework 会根据我们的配置生成 CloudFormation 配置。然而这也并非是一个真正用于生产的配置,真实的应用场景远远比这复杂
云计算经过这么多年的发展,逐渐进化到用户仅需关注业务和所需的资源比如,通过K8S这类编排工具用户只要关注自己的计算和需要的资源(CPU、内存等)就行了,不需要操心到机器这一层
serverless 为什么less架构让人们不再操心运行所需的资源,只需关注自己的业务逻辑并且为实际消耗的资源付费。可以說随着serverless 为什么less架构的兴起,真正的云计算时代才算到来了
任何新概念新技术的落地,本质上都是要和具体业务去结合去真正解决具體问题。虽然serverless 为什么less很多地方不成熟亟待完善。不过serverless 为什么less自身的优越特性对于开发者来说,吸引力是巨大的相信随着技术的飞速發展,serverless 为什么less在未来还有无限可能!