作者丨Werner Vogels
译者丨核子可乐
策划丨Tina
作者 Werner Vogels 是 Amazon.com 的 CTO,他撰写了一篇文章,总结 AWS 这二十多年来,怎么经过改造运用程序架构、调整企业安排架构等办法,让构建现代运用程序的客户“将更多时刻花在界说事务逻辑上,扩展体系以轻松满意顶峰期客户需求,进步敏捷性,一起更快、更频频地向商场发布新功用”。在文中他说到亚马逊“巨大的全体式‘书店’运用程序以及臃肿的数据库极大约束了咱们的速度与敏捷性。每逢咱们计划为客户供给新的功用或许产品,咱们就有必要在专为书店规划的运用程序傍边修改甚至重写许多代码”,将安排架构调整为小团队并“赋予他们对运用程序内特定部分的更多操作权限”,经过改动对技能的运用办法,事务交给速度进步十分显着,比方某轿车领域客户将将新功用的推出时刻由六个月缩短至一周。这篇文章表现的,比照咱们现在倡议的“中台论”,许多当地都不约而同了。也可谓是亚马逊的“中台论”,尽管他们并没有运用这个词。
立异一直是亚马逊公司 DNA 中的重要组成部分,但大约 20 年之前,咱们迎来了一场彻底的转型。其时的方针,是让咱们的迭代进程——创造、发动、从头创造、从头发动、筛选陈腐事物、再次重复——在速度进步一步进步。而咱们做出的改造,则深深影响到咱们构建运用程序甚至安排企业结构的详细办法。
那个时候,亚马逊所服务的客户数量远不及当下。尽管如此,咱们很清楚假如想要对本身供给的产品与服务加以扩展,首要有必要改动咱们的运用程序架构。
巨大的全体式“书店”运用程序以及臃肿的数据库尽管为 Amazon.com 供给了充沛的动力,但一起也极大约束了咱们的速度与敏捷性。每逢咱们计划为客户供给新的功用或许产品——例如视频流——时,咱们就有必要在专为书店规划的运用程序傍边修改甚至重写许多代码。这是一个绵长并且繁琐的进程,需求杂乱的和谐尽力,并且极大约束着咱们快速推进大规划立异的才干。
为了从底子上处理这一难题,咱们经过《分布式核算宣言》树立起新的改造蓝图。这是一份描绘新架构的内部文档。经过这份宣言,咱们开端将本身运用程序经过许多被称为“服务”的小型底子单元加以重组,然后大幅进步对亚马逊全体事务的扩展才干。
可是,改造运用程序架构仅仅故事的前一半。至于后一半……其时是 1998 年,亚马逊内部的各个开发团队都在运用相同的运用程序,因而每位职工都有必要针对其当时版别进行跨团队和谐。
为了支撑这种新式架构,咱们分解了功用层级结构,并将企业安排从头编列为小型自治团队——小到每次点餐只需求两份披萨。咱们将这些“双披萨团队”委派到不同的特定产品、服务或许功用集上,赋予他们对运用程序内特定部分的更多操作权限。这使得咱们的开发人员成为产品所有者,并可以依据自己的决议计划敏捷对单个产品发生影响。
拆分咱们的安排与运用程序结构无疑是个斗胆的主意,但一起也是个卓有成效的好主意。咱们得以更快地为客户供给立异效果,并且跟着亚马逊的快速开展,咱们现已从每年布置数十项功用开展为现在布置数百万项。更令人始料未及的是,咱们在构建这种高度可扩展根底设施方面取得的成功,终究促成了另一大中心竞赛力的开展与强壮——这便是 2006 年诞生的 AWS。
而咱们,现在仍在坚持双披萨团队这一底子建制。
当然,咱们绝不是仅有一家着重立异的公司。为了坚持竞赛力,亚马逊有必要不断进步敏捷性,然后继续发现新的机会并创造出更好的产品。也正由于如此,才会有越来越多的客户踏上与亚马逊当年相同的旅程,并转向现代运用程序开发。这种新办法需求从全体式架构搬迁至更小的底子单元——或许说“微服务”,并且除此之外,现代运用程序的最佳实践还要求在改动规划与构建技能之余,从头考虑其办理办法。
为了成功进步运用程序开发傍边的敏捷性与立异速度,安排有必要依据合适本身的次序选用以下五大元素:微服务、专用数据库、主动软件发布流水线、无服务器运营办法以及继续主动化安全确保。
1
架构办法:微服务
像亚马逊这样的大多数企业开端都是以全体式运用程序作为事务根底,由于这是一类开发速度最快、难度最低的体系。可是,这种将各个进程严密组合并作为单一全体服务的作法,往往会带来一系列严重问题。假如运用程序中的某个进程遭受需求顶峰,咱们只能扩展全体架构才干完结单个进程的扩容。
别的,跟着代码库规划的添加,功用的添加与改进也开端变得十分杂乱,这让企业很难实验以及完结新的主意。全体式架构还添加了运用程序的可用性危险,由于许多彼此依靠且严密耦合的进程会添加单一进程因毛病遭到的影响。
这便是微服务架构随企业开展而呈现的原因地点。运用微服务架构,运用程序将由许多独立组件构成,这些组件将各个运用程序的进程以单一服务办法运转。服务将专为事务功用而构建,例如在线购物车,并且每项服务只担任自己的一项功用。这些进程独立运转并由对应的一支开发团队担任办理,因而咱们可以对各服务进行独立更新、布置与扩展,终究满意对运用程序特定功用的需求。举例来说,当呈现用户购买峰值时,咱们可以单纯扩容购物车服务以强化承载才干。
跟着安排由全体式架构逐渐转向微服务架构,许多开发人员也期望经过流水线办理各项服务中的依靠联系——这就要求咱们创造出新的办法以完结运用程序打包与代码运转。好消息是,凭借着强壮的立异效果储藏,现在实例现已不再是咱们的仅有核算选项。
咱们也可以运用容器或许 AWS Lambda 函数。容器是现在最受欢迎的代码打包选项,一起也是完结留传运用程序现代化的最佳东西之一。容器技能,为咱们带来超卓的运用程序可移植性与设置灵活性。而运用 Lambda,咱们则可以更轻松地获取所需功用——运用代码编写出事务逻辑即可。
微服务架构的另一大需求,在于咱们有必要为之树立一种服务间的彼此通讯办法。现在大部分运用程序都继续沿袭 API 衔接,但也有一些挑选在不同服务之间发送数据。详细包含用于实时数据处理的流、用于依据数据改动触发呼应的事情,以及用于运用级通讯及可见性的服务网格等等。咱们可以依据本身需求挑选最合适自己运用程序的集成办法。
2
数据办理:专用数据库
现代运用程序选用解耦式数据存储机制,其间微服务与数据库逐个映射,意味着咱们不再需求保持一套巨大的全体数据库。这也是对传统运用程序的一大重要改造,旨在处理全体式运用程序随规划添加而遭受的扩展性与容错性难题。此外,单一数据库一起也代表着单点毛病源,并且很难满意一组不同微服务提出的特定需求。经过将数据与微服务剥离,咱们可以自由挑选最合适本身需求的不同数据库类型。
关于大部分运用程序,最佳选项仍然是联系数据库;但也有其它一些运用程序有着不同的数据需求。例如,假如咱们运转的是运用高度衔接型数据集的运用程序(例如引荐引擎),则可以挑选具有存储与导航联系的图数据库,例如 Amazon Neptune。
或许,假如您的运用程序需求实时拜访数据,也可以挑选 Amazon ElastiCache 等内存内数据库,其常用于游戏以及物联网运用场景。一般来说,可以充沛满意您微服务需求的数据库,便是最理想的数据库选项。
3
软件交给:主动发布流水线
咱们最初离别全体式架构并重组为双披萨团队时,主动发布流水线也就应运而生。这是为了脱节本来的单一版别发布通道,答应各个团队独立交给自己的开发效果。
尽管这种新办法消除了更新的开发与交给等和谐性应战,但一起也给咱们带来了不少新的难题。首要,保持悉数团队的发布流程与质量一致性变得十分困难。特别是考虑到发布流程中的每个进程都在以手动办法完结,这无疑会大大添加发生人为过错的可能性。
咱们的处理计划采纳左右开弓的办法:规范化加上主动化。首要,咱们将软件交给流程界说成最佳实践模板,旨在为云环境下的全部根底设施资源的建模与装备供给规范。这些“根底设施即代码”模板可以协助咱们的团队从正确之处起步,由模板经过代码为运用程序供给全体技能仓库,而不再依靠于手动进程。在亚马逊,这种作法确保了各个团队都可以依据咱们的要求完结对流程与布置的装备。
第二点,咱们开端运用主动化技能将手动流程从软件交给流水线中除掉出去。在主动化发布流水线的协助下(包含继续集成与继续布置,简称 CI/CD),咱们得以快速测验并发布许多代码,一起最大极限削减过错机率。经过 CI,咱们的团队会定时将代码改动整合至同一套中心库内。然后,咱们会对其运转主动构建与测验,以确保可以尽早发现问题。而运用 CD,咱们的团队每天可以屡次提交改动,且无需任何人为干涉即可将效果投入生产。
起先,咱们发现去掉人为干涉只会带来适当糟糕的布置结果。可是,咱们投入了许多时刻编写正确的测验与毛病处理计划,并终究发现新体系大大进步了咱们的速度与敏捷性,一起也明显增强了代码质量。
4
运营办法:尽可能选用无服务器办法
现代运用程序傍边包含许多活动部件。现在的现代运用程序往往由数千项服务组成,这远远超出了以往单一运用程序与数据库的领域,并且每一项服务背面都对应着一套专用数据库外加一支担任不断发布新功用的团队。
这些活动部件可以分为以下两类:
作为企业“独门绝技”的活动组件,担任确保事务成功,例如可以创造共同用户体会与开发立异产品的部分。
一般被咱们称为“无差别承载性”活动组件,这些活动有必要完结,但本身无法供给任何竞赛优势。关于大多数企业来讲,此类使命包含服务器办理、负载均衡以及安全补丁运用等等。
咱们在 2014 年提出了“无服务器”概念,并一起发布了 AWS Lambda。AWS Lambda 是一种核算服务,可以协助咱们在无需装备或许办理服务器的前提下运转代码。这种才干支撑起咱们的总体方针,即经过将无差别使命交给 AWS 担任以协助客户专心于优化自己的“独门绝技”。事实上,这全部现已成为现代运用程序开发中的关键性元素。无服务器办法使咱们解放精力,将更多时刻投入到真实让您的事务异乎寻常的方面——例如产品立异。
当咱们说起“无服务器”时,咱们指的是在无需走神于根底设施装备或许扩展的情况下运转的服务,其具有内置的可用性与安全性确保,且选用按运用量计费的办法。无服务器不只有 Lambda,它是一套完好的运用程序仓库。
运用程序仓库一般由以下三大要素组成:
像 AWS Fargate 这样的核算服务,用于运转运用程序逻辑
像 MySQL 以及 PostgreSQL 联系数据库这样的数据存储计划,也可以运用 Amazon Aurora 等完结数据的耐久驻留
相似于事情总线 Amazon EventBridge 这样的集成层,用于完结数据移动
这些无服务器构建单元使企业可以打造出充沛发挥无服务器办法优势的运用程序。
在亚马逊,咱们自己也还没有彻底完结无服务器化,但咱们正在朝着这个方向尽力。实际上,咱们以为很快就会呈现一整代只担任编写事务逻辑、而从未触摸过服务器的开发人员。这儿的原因很简单,不管您是在构建全新运用程序仍是搬迁旧有运用程序版别,运用无服务器原语进行核算、数据处理以及集成,都能确保咱们从云环境供给的敏捷性优势中获取最佳收益。
5
安全性:每个人都有职责
曩昔,许多企业都把安全视为一种奇特的“调味料”——在运用程序准备好发布之后,再仓促撒上一把。但这种办法在继续发布周期中显然会不服水土,因而安排有必要采纳新的安全办法,环绕整个运用程序构建起防火墙。但这相同带来新的应战:以往咱们只需求为全体式运用程序树立一种安全设置;但面临微服务架构中不计其数的独立进程,以往的安全思路底子处理不了问题。
有鉴于此,在现代运用程序傍边,咱们将安全功用内置于运用程序的各个组件之内,并跟着每个版别进行主动测验与布置。这意味着安全性不再是安全团队自己的职责——相反,安全深深融入到开发生命周期的每个阶段,而工程、运营以及合规团队都将在其间发挥自己的效果。
安全性将被整合至代码库、build 办理程序甚至布置东西傍边。这既适用于发布流水线本身,也相同适用于经过该流水线发布的软件。并且在运用无服务器服务的情况下,安全状况的保护难度更低,这是由于底层根底设施的安全运营作业——包含体系版别更新、软件修正与监控等——都以内置办法存在于各项服务傍边。
6
现代化之旅
那么,许多客户是怎么施行这些改动,然后推进运用程序现代化的?有必要供认,其间不存在一致的途径,但却有着不少常见的办法,也包含咱们在亚马逊采纳的办法。
当咱们决议专心于立异并大幅扩展 Amazon.com 时,咱们重构了全体式运用程序,对安排结构进行从头编列,然后运用主动化与抽象化两大手法推进云资源优化。Yelp 等客户也采纳了相似的现代化转型办法。
关于以内部保管运用程序作为起点的客户,最常见的办法自然是从头保管,即“将运用程序直接搬迁至云端”。在此之后,许多客户开端进一步探究云环境中的保管服务,测验将数据库与 API 办理等使命搬迁至 AWS,然后确保将自己的作业重心放在事务逻辑身上。
现在,越来越多的客户踏上了从头创造的路途,将新的运用程序构建为无服务器微服务办法,旨在充沛发挥云服务优势。现代化没有一致的正确办法,由于在 AWS 平台上,各式各样的运用程序都可以以不同的状况共存,并经过恣意途径完结成功交互。
但咱们也在其间看到了重要的共通点,即构建现代运用程序的客户可以审视本身全体事务优势,特别是对时刻与资源的优化分配。他们将更多时刻花在界说事务逻辑上,扩展体系以轻松满意顶峰期客户需求,进步敏捷性,一起更快、更频频地向商场发布新功用。
以向轿车买家供给最新车辆信息的 Edmunds.com 网站为例,他们将新功用的推出时刻由六个月缩短至一周。草创企业 Bynder 公司也将产品上市周期由本来的一年削减至一个月。经过改动对技能的运用办法,企业可以明显改进自己的事务交给途径以及相关体会。
而这,正是现代运用程序的力气地点。
https:///2019/08/modern-applications-at-aws.html
点个在看少个 bug