关键要点
-
Serverless应用程序不涉及操作服务器,并且应用程序的运行时间完全委托给了服务提供者。
-
Serviceful Serverless应用程序是一种尽可能利用第三方服务实现后端功能的应用程序。
-
Serviceful Serverless应用程序的主要优点是,与其他方式构建的应用程序相比,它们需要的后端代码数量要少很多。
-
更少的代码意味着更少的技术债务,更好和更一致的持续软件开发速度,并为普通开发人员提供更好的可维护性。
-
基础设施即服务的兴起引发了一种新的软件开发最佳实践(“云原生”),Serverless也是如此。你不可能将云原生应用程序迁移到功能即服务(FaaS)平台,并期望它们会获得最好的设计。
我们在优化什么/h3>
为一般开发者考虑
如果说软件正在蚕食世界,那么企业的成功在越来越大的程度上依赖于自身构建和部署软件的能力。由于大多数现代软件通常都是作为软件即服务(SaaS)提供的,因此软件开发是永久性的:企业需要随着时间的推移增加软件开发资源。因此,能够长期推动良好软件开发速度的企业应该胜过那些无法做到这一点的企业。
如果我们想要成为成功的软件开发企业,我们应该想办法让普通软件开发人员能够更容易地维护软件。让企业无法保持合理开发速度的主要痛点通常被描述为“技术债务”,但其背后的原因通常与短期思维(写代码时不考虑可维护性)或对未来开发人员的能力假设有关(假设写代码的团队会一直是维护代码的团队)。
代码越少,复杂性越低
如果我们想要让软件变得长期可维护,需要遵循两个基本策略:更少的定制代码和更少的复杂性。通常,维护较少的代码比维护较多的代码会更容易。请注意,这里是指定制代码。使用文档化程度较高且维护良好的库或服务可以避免自己编写和维护代码所带来的痛苦。
使软件更易于维护的另一个策略是降低代码库的复杂性。或许,圈复杂度概念是衡量复杂性的最佳方式。想象一下,要为最终用户启动和运行一个特定的路由,需要涉及系统管理、数据库管理、 络管理和IT运营。减少所需的组件数量就可以提高可维护性。
Serverless
今天,在开发新软件时,通过更少的代码和更低的复杂性来提高长期软件可维护性的最佳方法是使用Serverless软件架构。
定义
关于Serverless的定义存在很多争议(比如“但仍然有服务器存在”、“它是个糟糕的名字”),但我认为,当你理解了它的含义,就会知道这个名字其实是很有意义的:
-
不涉及服务器操作
-
我们不对运行时间负责
Serverless是我们过去25年来在SaaS中走的最后一步,因为我们已经渐渐将越来越多的职责交给了服务提供商。我们已经从自有数据中心转向了主机托管设施,从专用托管到基础设施即服务,从虚拟机到容器,但是它们都需要我们做一些个性化的系统工作。最初,我们遇到了很多问题,即使使用容了器,仍然需要打修补和处理第三方应用程序(例如Web服务器)故障。
Serverless将个性化服务器操作的数量降低到零,因为一切都是多租户的,并由服务提供商负责提供(注意:根据我的定义,在自己的Kubernetes集群上运行功能并不是“Serverless”)。在Serverless架构中,你不需要处理硬件设置、成本支出、操作系统安装和修补、应用程序安装和修补,或第三方应用程序故障。
“不操作服务器”的必然结果是“我们不对运行时间负责”。运行时间——除非是你自己的代码出了问题——取决于服务提供商。对于很多人来说,这是很可怕的(也许是因为他们不相信服务提供商,也许是因为他们担心他们会因此丢掉饭碗),但如果你的目标是减少代码和复杂性,只要服务提供商是可靠的,那么这就是实现目标的最佳方式。
Serverless的好处
并非所有Serverless架构都是一样的,有时候,Serverless应用程序有可能比典型的三层式单体应用程序更难维护。但是,如果实施得当,Serverless应用程序将提供比其他无法不使用Serverless的应用程序架构更大的优势:更少的相互依赖、更少的技术债务、一种有效的微服务架构,以及独立的生产等效环境。
恰当的Serverless架构存在较少的相互依赖性,因为整体应用程序的复杂性较低。Serverless应用程序包括应用程序前端代码、后端功能、第三方服务(例如Twilio、Algolia),以及这些功能和服务的配置。Serverless应用程序不处理操作系统、第三方服务器应用程序(如Web服务器)或任何特定于单个虚拟机或容器的部署代码。因此,相对于基于虚拟机或容器应用程序的开发者,Serverless应用程序开发者被迫等待另一个团队或其他团队成员的人数会更少。
在所有的应用程序架构中,Serverless应用程序拥有的代码量最少。我们将在下一节中通过一个示例来演示如何通过利用最有效的服务来消除代码。
尽管Martin Fowler建议在尝试将应用程序分解为微服务时先从单体架构开始,但随着我们转向具有自动可扩展后端功能的胖客户端,同时也获得了可靠的微服务架构。如果我们的应用程序需要扩展给越来越多的用户使用,我们在扩展应用程序方面的麻烦就会少很多,因为我们已经将前端与功能分开,并且功能之间也是相互分离的。
最后,由于Serverless应用程序是按照使用计费的,免除了空闲成本,因此,相比在虚拟机或容器架构中为所有开发人员提供单个开发环境,为每个开发人员提供单独且与生产环境等效的开发环境将更加便宜。这有助于提升开发人员的开发速度(如果有人搞坏自己的环境并不会阻碍到其他人)、应用程序部署代码(如果可能,自动部署所有人的代码),以及减少因环境差异造成的bug。
一个例子
让我们来看一个特定的应用程序示例,Hacker News上的“keepingscore”认为这是一个不能也不应该通过Serverless方式构建的应用程序:
应用程序
基于上面的描述,我们假设有一个由一个 站和两个移动应用程序前端(Android和iOS)组成的应用程序,它们与提供用户管理的后端发生交互,用户能够搜索、购买和分享航班和酒店行程,还提供了一个内部会计所必需的 告层。
更具体地说,我们可能需要考虑以下一些高级功能:
-
用户管理:
- 注册、登入登出、修改密码;
- 保存用户首选项。
-
用户界面:搜索和购买:
- 自动填充搜索条件(例如机场代码);
- 提交搜索条件;
-
支付。
-
用户界面:分享和修改:
- 查看,与其他用户分享行程;
- 更改(包括取消)行程。
-
后端:搜索和购买:
- 并行调用多个API;
- 合并响应,应用过滤器;
- 购买行程。
-
后端: 告:
- 运行有关购买、行程的分析 告。
现在,我们将介绍不同的架构选项,说明Serverless架构能够提供其他架构无法提供的优势。请注意,我们不需要太过关注客户端,因为我们可以假设所有客户端代码在这些不同的架构中都是相同的,唯一不同的是后端是如何实现的(另请注意,最终用户并不关心后端如何实现)。
架构1:典型的三层架构
架构2:纯粹的FaaS
架构3:Serviceful Serverless
等等,这怎么可能/h3>
有一些东西可以帮助人们从高层次理解如何实现代码行数的减少和可扩展性的提升。首先,可以先看看示例应用程序是怎么样运行的。AWS已经构建了一个组日历应用程序(截至2018年11月),Web版本(React)包含了702行JavaScript代码,原生Android版本包含了508行Java代码。如果你刚好在想着如何入门,AWS Amplify和Google Firebase提供的选项可让你在不到一个小时内启动并运行这种应用程序。
其次,Serviceful Serverless应用程序的一个关键创新是,以前需要通过代码完成的很多事情现在可以在服务配置中完成——根据服务的不同,有时候使用了图灵不完备的语言。图灵不完备的语言非常适合用作配置,并且最终会减少很多代码。
最后,你始终可以选择按照以前的方式完成工作,在必要时只需要编写自己的代码,而不是利用现有的服务。换句话说,Serviceful Serverless架构中最糟糕的情况是,你可以按照以前的方式来完成应用程序的某些部分。但对于应用程序的其他部分,你可以将绝大多数工作交给不需要你构建或维护的服务。
有关Serviceful Serverless的更多详细信息
Serviceful Serverless的一个关键部分是有一个托管服务处理来自客户端的API调用,并根据需要将它们路由到各种服务和功能,而不是为后端功能提供一个非常轻量的“ 关”。这类服务的最佳例子可能是AWS AppSync,尽管Google Firebase和Hasura也提供了API Hub服务(请注意,这些服务不同于现在的FaaS服务,因此在选择它们之前请先进行了解和测试!)。
这些API Hub服务的一个巨大好处是你可以通过它们直接将大多数请求路由到持久层,也可以将请求从持久层路由出去,而无需定制代码。在上面以FaaS为中心的架构和三层应用程序中,每个数据库读取和写入都需要通过你开发的应用程序代码。在上述的Serverless架构中,API Hub可以处理其中的很多请求——包括细粒度访问控制(请参阅https://docs.aws.amazon.com/appsync/latest/devguide/security.html#amazon-cognito-user-pools-authorization和https://firebase.google.com/docs/database/security/user-security)。
通过为所有后端功能使用托管服务,以及利用API Hub处理数据存储的读写请求,定制代码的行数急剧下降,并实现了应用程序的可维护性,而这是其他架构无法实现的。
反驳论点
与使用其他替代方案一样,你总是无法避免风险。从典型的三层应用程序架构(或多个双层微服务)迁移到Serviceful Serverless架构有助于提升应用程序的可维护性,但存在一些新的风险。我相信,在绝大多数情况下,这些风险是一种超过可接受的权衡,但我不想忽视它们。
我们不对运行时间负责
在我对Serverless的定义中,我将正常运行时间称为不是我们能够控制的东西。数据显示,主要的IaaS提供商在保持运行时间方面远远优于一般(甚至高于平均水平)的IT运营团队,因此,为他们支付远低于内部运营团队的费用来保持Serverless应用程序的运行(包括处理自动故障转移)对我来说完全不是个事。
也就是说,如果你构建一个依赖于很多不同服务提供商的应用程序,并尽可能接近100%的运行时间,随着服务提供商数量的增加,应用程序在未来某个时候发生故障的可能性也会增加。通常情况是提供商的数量越少越少。此外,明智的做法是提升应用程序处理非必要服务可用性的弹性。
供应商锁定
如果没有人喋喋不休地关注供应商锁定,服务的差异化就无从谈起。当然,有一些残酷的案例表明,IT供应商利用企业对他们的依赖,将产品的价值榨取到无以复加的地步。但是,如果你担心供应商锁定,至少应该要说服自己,摆脱特定供应商锁定并没有那么困难。
对于上面的Serviceful Serverless应用程序架构,你可以通过加入之前被免掉的定制代码迁移出这种架构。也就是说,迁移成本从11,000行代码变成了36,500行代码。如果你认为编写25,000行代码代价非常高(确实是这样,因为你必须维护所有新代码!),那么你支付给供应商的费用或许是合理的。但如果你认为编写代码成本更低,那么你就可以编写代码。此外,编写代码并不困难,因为他们已经提供了很好的API文档,并且你已经拥有可以调用这些API的代码。
换句话说,通过使用Serviceful Serverless架构,你可以避免自己编写代码,因为有另一个团队在为你编写代码,你只需要付给他们费用。如果你认为费用太高,可以在内部使用它们,并自行开发代码。这与数据库或虚拟化层的锁定不同,无状态应用程序代码更容易迁移。
经验法则
采用新架构概念最困难的地方在于了解你的实现方式对不对。我有三个“经验法则”可供你参考,用来判断应用程序是否正确利用了Serviceful Serverless的优势。
厚客户端,不是厚中间层
你希望将通用逻辑(如上例中的酒店/航班搜索)放在后端,并打算将十年前开发的应用程序中间层的很多内容转到服务(例如用于图像处理的Cloudinary或用于搜索的Algolia)或胖客户端(例如JavaScript框架)中。绝大多数定制代码应该放在客户端交互层中。这并不意味着你就不会有后端代码(例如上面示例中提到的API集成),能够控制所有最终用户交互的细节通常来说是有价值的,但自己开发可在其他地方购买的后端功能几乎是没有价值的。
功能是粘合剂,不要相互调用
如上所述,在Serverless架构内,功能之间的互相调用是一个错误的做法。从调试的难度到调用的开销,再到无限循环的成本,如果你能够消除造成圈复杂度的原因,那说明你很有钱。相反,你的定制代码功能应该是服务之间的粘合剂,例如接受客户端请求,从各种API中提取数据,将其合并为紧凑的数据结构,并将它们发送给数据存储和客户端。
自定义研究,而非自定义代码
如果你正在构建Serviceful Serverless应用程序,那么你需要花费更多的时间进行研究。这是因为你将基于服务实现更多的应用程序功能,并且需要验证选择了正确的服务。你还需要找出将服务与应用程序集成的正确方法。因此,你可以考虑花几天甚至几周时间编写概念验证代码,并测试不同的选项,而不是花一两个小时寻找你可能会用到的软件包。
换一种说法(两个方程式):
2周研究 + 1天开发 → N行代码需要维护
1天研究 + 2周开发 → 10N行代码需要维护
十倍代码行数就是十倍的技术债务,这意味着未来开发速度会越来越慢,越不可预测,普通开发人员也无法很好地维护系统。

Joe Emison是一位连续技术联合创始人,在3月份创办了他的第五家公司Branch。他之前的项目包括BuildFax(被DMGT收购)、Spaceful(被Xceligent收购)、BluePrince(被Harris Computer收购)和EphPod(被Wind Solutions收购)。此外,他还为其他公司提供软件开发和云迁移方面的咨询,其中包括很多DMGT产品组合。Joe毕业于威廉姆斯学院,获得英语和数学学位,并拥有耶鲁大学法学院的法律学位。
查看英文原文:
https://www.infoq.com/articles/serverless-sea-change
文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8711 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!