写点什么

通通透透看无服务器计算:由来、场景和问题

  • 2023-03-20
    北京
  • 本文字数:4915 字

    阅读完需:约 16 分钟

本文分享自天翼云开发者社区 @《通通透透看无服务器计算:由来、场景和问题》,作者:我是小朋友


一、无服务器(Serverless)计算是什么



 云计算涌现出很多改变传统 IT 架构和运维方式的新技术,比如虚拟机、容器、微服务,无论这些技术应用在哪些场景,降低成本、提升效率是云服务永恒的主题。过去十年来,我们已经把应用和环境中很多通用的部分变成了服务。Serverless 的出现,带来了跨越式变革。Serverless 把主机管理、操作系统管理、资源分配、扩容,甚至是应用逻辑的全部组件都外包出去,把它们看作某种形式的商品——厂商提供服务,我们掏钱购买。过去是“构建一个框架运行在一台服务器上,对多个事件进行响应”,Serverless 则变为“构建或使用一个微服务或微功能来响应一个事件”,做到当访问时,调入相关资源开始运行,运行完成后,卸载所有开销,真正做到按需按次计费。这是云计算向纵深发展的一种自然而然的过程。

 

Serverless 是一种构建和管理基于微服务架构的完整流程,允许你在服务部署级别而不是服务器部署级别来管理你的应用部署。它与传统架构的不同之处在于,完全由第三方管理,由事件触发,存在于无状态(Stateless)、暂存(可能只存在于一次调用的过程中)计算容器内。构建无服务器应用程序意味着开发者可以专注在产品代码上,而无须管理和操作云端或本地的服务器或运行时。Serverless 真正做到了部署应用无需涉及基础设施的建设,自动构建、部署和启动服务。

 

国内外的各大云厂商 Amazon、微软、Google、IBM、阿里云、腾讯云、华为云相继推出 Serverless 产品,Serverless 也从概念、愿景逐步走向落地,在各企业、公司应用开来。

 

二、理解 Serverless 技术---FaaS 和 BaaS

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

Serverless 涵盖了很多技术,分为两类:FaaS 和 BaaS。

1)Function-as-a-Service (FaaS)

• 小段代码,按需执⾏,按需扩展,无需管理任何基础实施相关的部分。

• 事件驱动型计算。函数被事件触发或者被 HTTP 请求调用。

2)Backend-as-a-Service (BaaS)

• 第三方基于 API 的服务,实现应用开发中的基础功能模块。

• 这些 API 像服务一样,自动扩展,无需管理。

 

1.Faas

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)。

 

2.Baas

BaaS(Backend as a Service,后端即服务)是指我们不再编写或管理所有服务端组件,可以使用领域通用的远程组件(而不是进程内的库)来提供服务。理解 BaaS,需要搞清楚它与 PaaS 的区别。


首先 BaaS 并非 PaaS,它们的区别在于:PaaS 需要参与应用的生命周期管理,BaaS 则仅仅提供应用依赖的第三方服务。典型的 PaaS 平台需要提供手段让开发者部署和配置应用,例如自动将应用部署到 Tomcat 容器中,并管理应用的生命周期。BaaS 不包含这些内容,BaaS 只以 API 的方式提供应用依赖的后端服务,例如数据库和对象存储。BaaS 可以是公共云服务商提供的,也可以是第三方厂商提供的。其次从功能上讲,BaaS 可以看作 PaaS 的一个子集,即提供第三方依赖组件的部分。

 

BaaS 服务还允许我们依赖其他人已经实现的应用逻辑。对于这点,认证就是一个很好的例子。很多应用都要自己编写实现注册、登录、密码管理等逻辑的代码,而对于不同的应用这些代码往往大同小异。完全可以把这些重复性的工作提取出来,再做成外部服务,而这正是 Auth0 和 Amazon Cognito 等产品的目标。它们能实现全面的认证和用户管理,开发团队再也不用自己编写或者管理实现这些功能的代码。

 

三、无服务器(Serverless)计算如何工作?

与使用虚拟机或一些底层的技术来部署和管理应用程序相比,无服务器计算提供了一种更高级别的抽象。因为它们有不同的抽象和“触发器”的集合。


拿计算来讲,这种抽象有一个特定函数和抽象的触发器,它通常是一个事件。以数据库为例,这种抽象也许是一个表,而触发器相当于表的查询或搜索,或者通过在表中做一些事情而生成的事件。


比如一款手机游戏,允许用户在不同的平台上为全球顶级玩家使用高分数表。当请求此信息时,请求从应用程序到 API 接口。API 接口或许会触发 AWS 的 Lambda 函数,或者无服务器函数,这些函数再从数据库表中获取到数据流,返回包含前五名分数的一定格式的数据。


一旦构建完成,应用程序的功能就可以在基于移动和基于 Web 的游戏版本中重用。


这跟设置服务器不同,不是必须要有 Amazon EC2 实例或服务器,然后等待请求。环境由事件触发,而响应事件所需的逻辑只在响应时执行。这意味着,运行函数的资源只有在函数运行时被创建,产生一种非常高效的方法来构建应用程序。

 

四、无服务器(Serverless)适用于哪些场景?


在现阶段,Serverless 主要应用在以下几个场景。首先在 Web 及移动端服务中,可以整合 API 网关和 Serverles 服务构建 Web 及移动后端,帮助开发者构建可弹性扩展、高可用的移动或 Web 后端应用服务。在 IoT 场景下可高效的处理实时流数据,由设备产生海量的实时信息流数据,通过 Serverles 服务分类处理并写入后端处理。另外在实时媒体资讯内容处理场景里,用户上传的音视频到对象存储 OBS,通过上传事件触发多个函数,分别完成高清转码、音频转码等功能,满足用户对实时性和并发能力的高要求。无服务器计算还适合于任何事件驱动的各种不同的用例,这包括物联网,移动应用,基于网络的应用程序和聊天机器人等。这里简单说两个场景,方便大家思考。


场景一:应用负载有显著的波峰波谷

Serverless 应用成功与否的评判标准并不是公司规模的大小,而是其业务背后的具体技术问题,比如业务波峰波谷明显,如何实现削峰填谷。一个公司的业务负载具有波峰波谷时,机器资源要按照峰值需求预估;而在波谷时期机器利用率则明显下降,因为不能进行资源复用而导致浪费。

 

业界普遍共识是,当自有机器的利用率小于 30%,使用 Serverless 后会有显著的效率提升。对于云服务厂商,在具备了足够多的用户之后,各种波峰波谷叠加后平稳化,聚合之后资源复用性更高。比如,外卖企业负载高峰是在用餐时期,安防行业的负载高峰则是夜间,这是受各个企业业务定位所限的;而对于一个成熟的云服务厂商,如果其平台足够大,用户足够多,是不应该有明显的波峰波谷现象的。

 

场景二:典型用例- 基于事件的数据处理

视频处理的后端系统,常见功能需求如下:视频转码、抽取数据、人脸识别等,这些均为通用计算任务,可由函数计算执行。


开发者需要自己写出实现逻辑,再将任务按照控制流连接起来,每个任务的具体执行由云厂商来负责。如此,开发变得更便捷,并且构建的系统天然高可用、实时弹性伸缩,用户不需要关心机器层面问题。

 

五、Serverless 的问题

对于企业来说,支持 Serverless 计算的平台可以节省大量时间和成本,同时可以释放员工,让开发者得以开展更有价值的工作,而不是管理基础设施。另一方面可以提高敏捷度,更快速地推出新应用和新服务,进而提高客户满意度。但是 Serverless 不是完美的,它也存在一些问题,需要慎重应用在生产环境。


1、不适合长时间运行应用

Serverless 在请求到来时才运行。这意味着,当应用不运行的时候就会进入 “休眠状态”,下次当请求来临时,应用将会需要一个启动时间,即冷启动时间。如果你的应用需要一直长期不间断的运行、处理大量的请求,那么你可能就不适合采用 Serverless 架构。如果你通过 CRON 的方式或者 CloudWatch 来定期唤醒应用,又会比较消耗资源。这就需要我们对它做优化,如果频繁调用,这个资源将会常驻内存,第一次冷启之后,就可以一直服务,直到一段时间内没有新的调用请求进来,则会转入“休眠”状态,甚至被回收,从而不消耗任何资源。


2、完全依赖于第三方服务

当你所在的企业云环境已经有大量的基础设施的时候,Serverless 对于你来说,并不是一个好东西。当我们采用某云服务厂商的 Serverless 架构时,我们就和该服务供应商绑定了,那么我们再将服务迁到别的云服务商上就没有那么容易了。

 

我们需要修改一下系列的底层代码,能采取的应对方案,便是建立隔离层。这意味着,在设计应用的时候,就需要隔离 API 网关、隔离数据库层,考虑到市面上还没有成熟的 ORM 工具,让你既支持 Firebase,又支持 DynamoDB 等等。这些也将带给我们一些额外的成本,可能带来的问题会比解决的问题多。

 

3、缺乏调试和开发工具

当我使用 Serverless Framework 的时候,遇到了这样的问题:缺乏调试和开发工具。后来,我发现了 serverless-offline、dynamodb-local 等一系列插件之后,问题有一些改善。然而,对于日志系统来说,这仍然是一个艰巨的挑战。

 

每次你调试的时候,你需要一遍又一遍地上传代码。而每次上传的时候,你就好像是在部署服务器,并不能总是快速地定位出问题在哪。后来,找了一个类似于 log4j 这样的可以分级别记录日志的 Node.js 库 winston。它可以支持 error、warn、info、verbose、debug、silly 六个不同级别的日志,再结合大数据进行日志分析过滤,才能快速定位问题。


4、构建复杂

Serverless 很便宜,但是这并不意味着它很简单。AWS Lambda 的 CloudFormation 配置是如此的复杂,并且难以阅读及编写(JSON 格式),虽然 CloudFomation 提供了 Template 模板,但想要使用它的话,需要创建一个 Stack,在 Stack 中指定你要使用的 Template,然后 aws 才会按照 Template 中的定义来创建及初始化资源。

 

而 Serverless Framework 的配置更加简单,采用的是 YAML 格式。在部署的时候,Serverless Framework 会根据我们的配置生成 CloudFormation 配置。然而这也并非是一个真正用于生产的配置,真实的应用场景远远比这复杂。

 

六、总结

云计算经过这么多年的发展,逐渐进化到用户仅需关注业务和所需的资源。比如,通过 K8S 这类编排工具,用户只要关注自己的计算和需要的资源(CPU、内存等)就行了,不需要操心到机器这一层。

 

Serverless 架构让人们不再操心运行所需的资源,只需关注自己的业务逻辑,并且为实际消耗的资源付费。可以说,随着 Serverless 架构的兴起,真正的云计算时代才算到来了。

 

任何新概念新技术的落地,本质上都是要和具体业务去结合,去真正解决具体问题。虽然 Serverless 很多地方不成熟,亟待完善。不过 Serverless 自身的优越特性,对于开发者来说,吸引力是巨大的。相信随着技术的飞速发展,Serverless 在未来还有无限可能!

————————————————

版权声明:本文为 CSDN 博主「weixin_34124939」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_34124939/article/details/85017690

 

用户头像

还未添加个人签名 2022-02-22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
通通透透看无服务器计算:由来、场景和问题_天翼云开发者社区_InfoQ写作社区