做视频网站好做吗,清远医疗网站建设,修改散文网站,中国摄影简介#xff1a; Serverless 架构从使用技术上有计算#xff0c;数据存储#xff0c;消息通信#xff0c;我们可从运维性#xff0c;安全性#xff0c;可靠性#xff0c;可扩展性#xff0c;成本几个角度来衡量架构的优劣。本文会介绍一些常见的业务场景#xff0c;探…简介 Serverless 架构从使用技术上有计算数据存储消息通信我们可从运维性安全性可靠性可扩展性成本几个角度来衡量架构的优劣。本文会介绍一些常见的业务场景探讨如何使用 Serverless 架构来支持这些场景。
Serverless 架构
按照 CNCF 对 Serverless 计算的定义Serverless 架构应该是采用 FaaS函数即服务和 BaaS后端服务服务来解决问题的一种设计这个定义让我们对 Serverless 的理解稍微清楚了一些但是可能也造成了一些争论。 1. 随着需求和技术的发展业界出现了一些 FaaS 以外的其它形态的 Serverless 计算服务比如 Google CloudRun阿里云推出了面向应用的 Serverless 应用引擎服务这些服务也提供了弹性伸缩能力和按使用计费的收费模式具备 Serverless 服务的形态可以说进一步扩大了 Serverless 计算的阵营。
2. 为了解决冷启动影响FaaS 类如阿里云的函数计算和 AWS 的 Lambda 也相继推出了预留功能。
3. 另外一些基于服务器Serverful的后端服务也推出了 Serverless 形态产品比如 AWS Serverless Aurora阿里云 Serverless HBase 服务。
因此Serverless 的界线是有些模糊但是云服务是在 Serverless 方向上不断演进的。一个模糊的东西如何指导我们解决业务问题呢Serverless 有一个最根本的理念是让用户最大化的专注业务逻辑。其它的特征如不关心服务器自动弹性按使用计费等等都是为了实现这个理念而服务。Serverless 的理念可以让我们更好地用有限的资源解决真正需要解决的问题正是因为我们少做了一些事情转而让别人做这些事情我们才可以在业务上做的更多。
著名的 Serverless 实践者 Ben Kehoe 这样描述 Serverless 原生心智
1. 我的业务是什么
2. 做这件事情能不能让我的业务出类拔萃
3. 如果不能我为什么要做这件事情而不是让别人来解决这个问题
4. 在解决业务问题之前没有必要解决技术问题。
在实践 Serverless 架构时最重要的心智不是选择哪些流行服务和技术攻克哪些技术难题而是时刻铭记在心专注业务逻辑这样更容易让我们选择合适的技术和服务明确如何设计应用架构。 Serverless 架构从使用技术上有计算数据存储消息通信我们可从运维性安全性可靠性可扩展性成本几个角度来衡量架构的优劣。本文会介绍一些常见的业务场景探讨如何使用 Serverless 架构来支持这些场景。为了让这种讨论不过于抽象下面会介绍一些具体的技术实现作为参考但是这些架构的思想是通用的可以用其它类似产品实现。
静态站点 静态站点的业务需求是比较简单的它相当于一个信息展示的站点。比如早期网站都是静态展示如图是1997年的中国黄页它其实就是一个单层的页面。其特征可以分为三点
1、它的页面是偏静态的展示信息。
2、其页面更新并不频繁。
3、不确定访问量。
架构的演进
图中所展示出的由云下到云上由管理服务器到无需管理服务器即 Serverless的转变给开发者带来了巨大的受益。如前两种方案需要预算扩展实现高可用自行监控等而当年中国黄页开发者的业务逻辑只是想单纯的展示信息让世界了解中国。 正好与 Serverless 原生心智相吻合即让开发者最大化的去专注业务逻辑。 买台服务器放在 IDC 机房里托管运行站点。为了解决高可用的问题又买了负载均衡服务和多个服务器。采用静态站点方式站长直接将站点由对象存储服务如 OSS支持并使用 CDN 做缓存。
传统架构模式下开发网站会把网站部署在服务器上随后再把这个服务器托管到机房然后用户或者客户端用电脑浏览器去访问这个网站。它所存在弊端就是如果这个网站出现问题服务器不再可用为了维护这个网站的高可用性会再挂一个负载均衡和两个储备服务器这就是 Serverful 服务的架构。Serverless架构对于开发人员来说它只需要把它的静态页面直接发布到对象存储而对象存储本身就是一个serverless的文件存储服务它可以存储静态页页面、图片、音频、视频等等并且做到无限扩展。
Serverless 架构有着其它方案无法比拟的优势
无需管理服务器比如操作系统的安全补丁升级故障升级高可用性这些云服务OSSCDN都帮着做了。无需对资源做预估和考虑未来的扩展因为 OSS 本身是弹性的使用 CDN 使得系统延迟更小费用更低可用性更高。按实际使用的资源付费包括存储费用和请求费用没有请求时不收取请求费用。安全性这样一个系统甚至看不到服务器不需要通过SSH登录DDOS 攻击也交给云服务来解决。静态是个好东西缓存也是软件开发经常用到的技术虽然有句玩笑是说计算机技术只有两个最难的事情让缓存失效和命名。但是这也体现了缓存的重要性只要运用得当能大大提升系统的性能。
比如说目前很多安卓应用要发布到如小米应用商店、华为应用商店等各种渠道商开发者更希望的是打包好一个母包放在对象存储里而不是反复做打渠道包维护等重复工作。对用户来说只需要维护一个母包然后再维护一个简单的动态计算即可。其实 CDN 不只可以回源到对象存储还可以回源到动态后端如 API 网关函数计算负载均衡器等也不止有 CDN 可以这种类型的缓存还可以使用 Redis以及进程内的缓存。
单体和微服务
为何会有单体和微服务因为静态站点的话它可能只是解决一些展示信息的需求但是随着业务需求复杂程度增加就需要动态站点了。比如
淘宝的商品页面采用静态页面方式管理商品信息是不现实的。商品数量众多商品上架下架信息更新频繁商品页面复杂。网易、新浪门户网站 实时新闻不断更新评论、点赞 转发等静态页面和站点适合用于内容少更新频率低的场景反之比如像图中淘宝的一个商品详情页使用静态站点的页面是不太现实的原因有下
1、商品是海量的。
2、更新频繁
3、动态信息来源广泛如基本信息、价格、运费、销量、库存、评论等是实时变化的。
上面提到的 Serverless 原生心智有助于我们专注业务。比如
是否需要自己购置服务器安装数据库实现高可用管理备份升级版本等还是可以把这些事情交给托管的服务如 RDS是否可以使用表格存储Serverless HBase 等 Serverless 数据库服务实现按使用的弹性扩容缩容和付费。单体应用是需要自己购置服务器运行还是可以交给托管服务如函数计算和Serverless 应用引擎。是否可以通过函数来实现轻量级微服务依赖函数计算提供的负载均衡、自动伸缩、按需付费、系统监控等能力。基于 Spring Cloud、Dubbo、HSF 等实现的微服务应用是否需要自己购置服务器部署应用管理服务发现负载均衡弹性伸缩熔断系统监控等还是可以将这些工作交给诸如 Serverless 应用引擎服务。
关于架构的演进经历了 Serverful 单体架构到 Serverful 微服务架构再到 Serverless 微服务架构过程。随着业务的发展组织规模的不断增大这时候一般就需要将单体应用中的逻辑拆分成多个执行单元比如商品页面上的评论信息售卖信息配送信息等都可以对应一个单独的微服务而右图的架构引入了API网关、函数计算或SAE来实现计算层将大量工作交换云服务完成。Serverless 这种微服务架构的好处是每个单元都能高度自治单元之间松耦合易于开发比如使用不同技术、部署和扩展。 但是这种架构也引入了分布式系统的一些问题如服务间通信的负载均衡失败处理分布式事务等。处在不同阶段不同规模的组织可以选择适合的方式能解决它面临的首要的业务问题。 其实这里的商品页面虽然信息繁多但是相对来说依旧比较简单主要是因为这里只是涉及到了读操作。这种图显示了系统内部多个微服务的交互。通过提供一个商品聚合服务将内部的多个微服务统一的呈现给外部。这里的微服务可以通过SAE或者函数实现。
另一个延伸是我们开始的业务需求没有提到需要支持不同客户端的访问现实中这种需求是常见的不同的客户端需要的信息可能是不同的。比如手机可以根据位置信息做相关推荐。如何让手机客户端和不同浏览器都能受益于 Serverless 架构呢
这又牵扯出了另一个词BFFbackend for fronted即为前端定做的后端这受到了前端开发工程师的推崇Serverless 技术让这个架构广泛流行因为前端工程师可以从业务角度出发直接编写 BFF而无需管理服务器相关的让前端工程师更加头疼的事情。
事件触发
本节通过介绍一个具体的业务场景对于事件触发类的场景阐述 Serverless 架构是怎样解决问题的。前面提到的动态页面生成是同步请求完成的还有一类常见场景其中请求处理通常需要较长时间或者较多资源比如用户评论中的图片和视频内容管理涉及到如何上传图片和处理图片缩略图水印审核等视频处理以适应不同客户端播放需求等。比如该图中业务场景是一个买家秀当买家完成了交易想要发表图片或者视频的评论买家完成后后端的服务要对这个图片加水印然后缩放并且审核视频也需要做多种格式的转换和审核因为要适配各种不同的终端。 这种业务特征实际上是非常耗 CPU 的每次任务执行的时间一般比较长因此针对于这种业务我们可能会有一些技术架构的演进。
比如大家所熟悉的抖音就是用户上传视频的业务场景。在抖音后端也是需要对视频进行统一处理的如加水印转码成各种不同的码率或者是长宽分辨率去配适不同的手机。这个业务落户是十分消耗 CPU 计算资源的。同时带宽的压力也很大。这个时候你只能不停地加带宽加机器其结果就是运维和维护成本不断增加第二个问题就是会存在波峰波谷比如说早上8点钟的地铁时间和中午吃饭的1钟或者晚上8点钟的时候业务量可能是非常高的如果你的业务需要1000台机器但是到了凌晨这1000台机器可能就用不上因此便会造成资源的一些浪费同时你还要处理运维监控扩弹性扩缩容等工作。 将架构演进再延伸一下事件触发能力是 FaaS 非常重要的特性这种 Pub-Sub 事件驱动模式不是一个新的概念但是在 Serverless 流行之前事件的生产者消费者以及中间的连接枢纽都是用户负责的就像前面架构演进中的第二个架构。Serverless 让生产者发送事件维护连接枢纽都从用户职责中省略了而只需关注消费者的逻辑这是 Serverless 的价值。函数计算服务还集成其它云服务事件源让你更方便的在业务中使用一些常见的模式如 Pub/Sub事件流模式Event Sourcing 模式。
服务编排
前面的商品页面虽然复杂但是所有的操作都是读操作聚合服务 API 是无状态、同步的。我们来看一下电商中的一个核心场景——订单流程。 比如说用户在淘宝里面进行了购物或者说在饿了么下单了外卖它都是涉及到一个订单的流程。这种订单流程是比商品展示更为复杂的。因为在订单流程里面它所要保留更多的事情。比如有用户下单时我们第一步要检查库存库存储量够的话然后库存减1 随后接通支微信或者说支付宝的服务去支付扣款单子下来了以后还要安排物流去配送同时还要查看物流的详情并进行短信通知等等。 同时在这些代码逻辑中你要写各种重试逻辑。如果说最终失败的话我们便要对已完成的事情进行回滚如若用户取消订单那么需要回滚的则更多。比如说这个钱要退还给用户这个场景是是非常复杂的我们可以看一下这个流程怎么发起来的。比如说第一步用户下单之后其实是走到了这个订单服务这个订单服务会生成订单号然后会涉及到买家是谁卖家是谁。第二步我们会把消息发送到消息总线其他的这些服务配送服务、库存服务、支付服务是订阅到消息总线的。
另一方面它的可观测性、可描述性并不好其次在编排上它的复用性很差。如若说开发者改成了另外一个流程的服务那么这一套就要重新改写了。 在这个 Serverless 架构里各个服务直接是独立的也不通过事件传递信息而是有一个集中的协调者服务来调度单个业务服务业务逻辑和状态由集中协调者维护。从网关层下单后触发函数计算的一次函数执行函数执行的逻辑会触发一个工作流的执行。就比如说右边这张图其实就是用户自己去编写的这个流程就是工作流。
比如说第一步下单第二步付钱付钱成功了会如何付钱失败了应该怎样。整个订单就相当于是右侧流程的执行。而每次流程的执行都是可以被追溯的。你可以理解成他就是个组织者然后调用其他的云服务。
所以在这个架构我们可以看出对开发者而言不需要去做消息总线从事逻辑的处理维护数据的一致性等到。他只需要专注他的业务逻辑把每个流程调用的服务写好把这些编排的流程写好就可以了。
编写大量代码来实现编排逻辑、状态维护和错误重试等功能而这些实现又很难被其它应用重用。维护运行编排应用的基础设施以确保编排应用的高可用性和可伸缩性。考虑状态持久性以支持多步骤长时间运行流程并确保流程的事务性。
如果直接依赖于云上的服务比如阿里云的 Serverless 工作流服务这些事情都可以交给平台来做。用户又回到了只需关注业务逻辑的状态。右图是流程定义我们可以看到这实现了前面基于事件的 Saga 模式的效果并且流程的复杂度大大简化。
Serverless 技术毫无疑问将会承担更多的责任让用户更快更好的构建应用。使用 Serverless 架构可以覆盖很多场景这里只是介绍了 Web 网站前端后端微服务事件触发服务编排等几个场景的架构。Less is more 把事情交给可靠的平台比如云厂商去做让开发者可以更加聚焦自身的核心业务价值是 Serverless 所一直推崇的理念。
原文链接 本文为阿里云原创内容未经允许不得转载。