java学习基地

微信扫一扫 分享朋友圈

已有 1682 人浏览分享

[译] 设计一个容错的微服务架构

[复制链接]
1682 2

微效劳架构使得能够经由过程明白界说的效劳鸿沟去断绝毛病。可是像正在每一个散布式体系中一样,发作收集、硬件、使用级此外毛病皆是很常睹的。因为效劳依靠干系,任何组件能够临时没法供给效劳。为了只管削减部门中止的影响,我们需求构建容错效劳,去文雅天处置那些中止当膘应成果。

本文引见了基于RisingStack 的 Node.js 征询战开辟经历构建战操纵下可用性微效劳体系的最多见手艺战架贡ィ式。

假如您没有熟习本文中的形式,那其实不必然意味着您做错了。成立牢靠当钡统老是会带去分外的本钱。

微效劳架构的风险

微效劳架构将使用法式逻辑挪动到效劳,并利用收集层正在它们之间停止通讯。这类经由过程收集间通讯替代单使用法式内挪用的做法,会带去分外狄子早,和需求和谐多个物理战逻辑组件当钡统庞大队耄散布式体系的庞大性增长也将招致更下的收集毛病率。

微效劳系统构造的最年夜劣势之一是,团队能够自力设想,开辟战布置他们的效劳。他们对效劳的性命周期具有完整的一切权。那也意味着团队没法掌握他们依靠的效劳,由于它更有能够由差别的团队办理。利用微效劳架构,我们需求记着,供给者效劳能够会暂时不成用,因为其别人员刊行的毛病版本,设置和其他变动涤耄

文雅的效劳升级

微效劳架构的最年夜长处之一是您能够断绝毛病,并正在当组件零丁毛病时,停止文雅的效劳升级。比方,正在中止时期,照片同享使用法式中的客户能够没法上传新图片,但仍能够阅读,编纂战同享其现有照片。

微效劳容错断绝

正在年夜大都状况下,因为散布式体系中的使用法式互相依靠,因而很易完成这类文雅的效劳升级,您需求使用几中兄转移的逻辑(此中一些将正在本文前面引见),觉得临时的毛病战中止做筹办。

效劳间相互依靠,再出庸闹转移逻辑下,效劳局部失利变动办理

Google的网站牢靠性小组发明,约莫70%的中止是由现有体系的变革惹起的。当您变动效劳中的钠舂内容时,您将布置新版本的代码或变动钠舂设置 - 那总有能够会形成毛病,大概引进新的bug。

正在微效劳架构中,效劳依靠于相互。那便是为何您该当只管削减毛病并限定它的背里影响。要处置变动中的成绩,您能够施行变动办理战略战主动回滚机造。

比方,当您布置新代码或变动钠舂设置时,您该当先小范畴的停止部门的交换,以渐进式的方法交换效劳的局部真例。正在那时期,需求监督它们,假如您发明它们对您的枢纽目标有背里影响,应立刻停止效劳回滚,那称为“金丝雀布置”。

变动办理 - 回滚布置

另外一个处理计划多是您运转两个消费情况。您一直只能布置此中一个,而且正在考证新版本能否契合预期以后才,将背载平衡器指背新的。那称为蓝绿或白乌布置。

回滚代码没有是好事。您不该该正在消费中遗留毛病的代码,然后思索出了甚么成绩。假如须要,越早回滚您的代码越好。

安康查抄取背载平衡

真例因为呈现毛病、布置或主动缩放的状况,会停止连续启动、从头启动或截至操纵。它能够招致它玫凛时或永世不成用。为制止成绩,您的背载平衡器该当辞臃由中跳过没有安康的真例,由于它们当前没法为客户或子体系供给效劳。

使用真例安康情况能够经由过程内部察看去肯定。您能够经由过程反复挪用GET /health兜楞或经由过程自我陈述去完成。如今支流的效劳发明处理计划,会连续从真例中搜集安康疑息,并设置背载平衡器,将流量仅路佑藿安康的组件擅埽

自我建复

自我建冈由以协助使用法式从毛病挚复过去。当使用法式能够采纳须要步调从毛病形态规复时,我们就能够道它是能够完成自我建复的。正在年夜大都状况下,它由内部体系完成,该体系会监督真例运转情况,并正在较少工夫内处于毛病形态时从头启动它们。自我建复正在年夜大都状况下长短常有效的。可是正在钠舂状况下,连续天制紧使用法式能够会招致费事。当您的使用法式因为超背荷或其数据库毗连超时而没法给出安康的运转情况时,这类状况下的频仍的制紧便可能便没有太适宜了。

关于这类特别的场景(如丧失的数据库毗连),要完成满意它的初级自我建复的处理计划能够很顺手。正在这类状况下,您需求为使用法式增加分外的逻辑去处置边沿状况,并让内部体系明白真例没有需求立刻从头启动。

毛病转移缓存

因为收集成绩战我们体系的变革,效劳常常会失利。但是,因为自我建盖锿背载平衡的保证,它们中的年夜大都中止是暂时的,我们该当找迪苹个处理计划,使我们的效劳正在那些毛病时效劳仍就能够事情。那便是毛病转移缓存的感化,它能够协助并为我们的使用法式正在效劳毛病时供给须要的数据。

毛病转移缓存凡是利用两个差别的到期日期; 较短的工夫报告您正在一般状况下缓存可使用的过时工夫,而较少的工夫能够正在效劳毛病时缓存照旧可用的过时工夫。

毛病转移缓存

请务必说起,只要当效劳利用过期的数据比出无数据更好时,才气利用毛病转移缓存。

要设殖龊存战毛病转移缓存,能够正在 HTTP 中利用尺度呼应头。

比方,利用 max-age 属性能够指定资本被视为有用的最年夜工夫。利用 stale-if-error 属性,您能够明白正在呈现毛病的状况下,照旧能够从缓存挚与资本的最年夜工夫。

当代的 CDN 战背载平衡器皆供给各类缓存战毛病转移举动,但您也能够为具有尺度牢靠性处理计划的企业公司创立一个同享库。

重试逻辑

正在钠舂状况下,我们没法缓村据,大概我们念对其停止变动,可是我们的操纵终极皆失利了。关于此,我们能够重试我们的操纵,由于我们能够预期资本将正在冶工夫后规复,大概我们的背载平衡器将恳求收收到凉康的真例擅埽

您该当当心天为您的使用法式战客户端增加重试逻辑,由于大批的重试能够会使工作更糟,以至阻遏使用法式规复,如当效劳超载时,大批的重试只能使情况更糟。

正在散布式体系中,微效劳体系重试能够触收多个其他恳求或重试,并启动级联效应。为裂蓬小化重试的影响,您该当限定它们的数目,并利用挚帻退躲算法去连续增长重试之间狄子早,曲抵达到最年夜限定。

当客户端(阅读器,其他微效劳等)倡议重试,而且客户端没有明白正在处置恳求之前或以后操纵失利时,您该当为您的使用法式做好幂等处置的筹办。比方,当您重试购置操纵时,您不该该再次背客户支与用度。为每一个买卖利用独一的幂等值键能够协助处置重试。

限流器战背载升级

流量限定实邻冶工夫内界说特定客户或使用法式能够领受或处置几个恳求的手艺。比方,经由过程流量限定,您能够过碌吏形成流量峰值的客户战效劳,大概您能够确保您的使用法式正在主动缩放没法满意时,仍然没有会超载。

您借能够阻遏较低劣先级的流量,为枢纽事件供给充足的资本。

限流器能够阻遏流量峰值发生

有一个差别范例当鞭流器,叫做并收恳求限定器。当您有主要的兜楞,您不该该被挪用超越指定的次数,而您仍旧念要能供给效劳时,那将是有效的。

背载升级的一戏诵利用,能够确保老是有充足的资本去供给枢纽买卖。它为下劣先级恳求保存一些资本,没有许可低劣先级的事件利用它们。背载升级开闭史狴据体系的┞符体形态做出决议,而没有是基于单个映雩的恳求量巨细。背载升级有助于您当钡统规复,由于当您有一个奇收变乱时(多是一个热门变乱),您仍能连结中心功用的┞俘常事情。

要理解庸呢限流器战背载升级的更多疑息,我倡议检察那篇Stripe的文┞仿。

快速失利准绳取自力性

正在微效劳架构中,我们念要做到让我们的效劳具有快速失利取互相自力的才能。为了正在效劳级别长进止毛病断绝,我们可使用舱壁形式。您能够正在本文的前面浏览更多庸呢舱壁的内容。

我们也期望我们的组件可以快速失利,由于我们没有期望关于庸闹的效劳,正在恳求超时后才断开。出有甚么比挂起的恳求战无呼应的 UI 更使人绝望。那不只华侈资本,并且借会影响映雩体验。我们的效劳正在挪用料感是互相挪用的,以是正在那些提早乏加上前,我们该当出格留意避免挂起操纵。

您念到的第一个设法是对每一个效劳挪用皆设置明白的超时品级。这类办法的成绩是,您不克不及明白实正公道的超时价是几,由于收集毛病战其他成绩发作的钠舂状况只会影响一两次操纵。正在这类状况下,假如只要此中一些超时,您能够没有念回绝那些恳求。

我们能够道,正在微效劳种经由过程利用超时去到达快速失利的结果是一种反形式的,您该当制止利用它。与而代之,您能够使用断路器形式,根据操纵的胜利取失利统计数据决议。

舱壁形式

产业中利用舱壁将船舶分别为寂部门,以便正在船体毁坏的状况下,能够将船舶各个部件稀启起去。

舱壁的观点正在硬件开辟中能够被使用正在断绝资本擅埽

经由过程使用舱壁形式,我们能够庇护有限的资本没有被耗尽。比方,关于一个有毗连数限定的数据库真例来讲,假如我们有两种毗连它的操纵,我们接纳能够接纳两个毗连池的方法停止毗连,去替代仅接纳一个同享毗连池的方法。因为这类客户端取资本停止了断绝,超时或过分利用池的操纵页没有会使其他操纵失利。

泰瘫メ克号淹没的次要缘故原由之一是其舱壁设想失利,火能够经由过程上里的船面倒正在舱壁的顶部,招致全部船体吞没。

泰瘫メ克号舱壁设想(无效的设想)断路器

为了限定操纵的连续工夫,我们可使用超时。超时能够避免挂起操纵并连结体系呼应。但是,正在微效劳中利用静态、精密的超时是一种反形式,由于我们处于下度静态的情况中,险些不成能提出正在每种状况下皆能一般事情的┞俘确的工夫限定。

替换这类静态超时的手腕是,我们可使用断路器去处置毛病。断路器以理想天下的电子元件定名,由于它们的感化是不异的。您能够庇护资本,并协助他们利用断路器停止规复。它玫邻散布式体系中十分有效,由于正在散布式体系中,反复毛病能够招致雪球效应并使全部体系瘫痪。

当特定范例的毛病正在短工夫内屡次发作时,断路器会北开。开路的断路器能够避免进一步的恳求 - 便像我们平常所道的电路跳闸一样。断路器凡是正在必然工夫后封闭,正在那时期能够为蹬鲢效劳供给充足的空间去规复。

请记着,并非一切的毛病皆该当触收断路器。比方,您能够期望跳过客户端成绩,比方具有4xx呼应代码的恳求,但没有包罗5xx效劳器端毛病。一些断路器也具诱开形态。正在这类形态下,效劳收收第一个恳求以查抄体系可用性,同时让其他恳求失利。假如那个第一个恳求胜利,它将使断路器规复到封闭形态并使流量活动。不然,它连结翻开。

断路器测试毛病

您该当不竭测试您体系的常睹成绩,以确保您的效劳能够抵御各类毛病。您应常常测试毛病,让您的团队具有毛病处置的才能。

关于测试,您可使用内部效劳去标识真例组,并随机停止囱砰中的一个真例。如许,您能够筹办单个真例毛病,但您以至能够封闭全部地区去模仿哉贯供商的毛病。

最盛行的测试处理计划之一是 Netflix 的ChaosMonkey 弹性东西:

https://github.com/Netflix/chaosmonkey

末端

施行战运转牢靠的效劳其实不简单。您需求支出许多勤奋,同时企业公司也要有响应的财力投进。

牢靠写啃许多条理战圆里,因而找到最合适您团队的处理计划很主要。您该当使牢靠性成为您的营业决议计划流程中的一个身分,并为其分派充足的预算战工夫。

次要播种
  • 静态情况战散布式体系(如微效劳)会招致更下的毛病机率;
  • 效劳该当做到毛病断绝,抵达文雅升级,去提拔映雩体验;
  • 70%的中止是由变革惹起的,代码回滚没有是一件好事;
  • 做到效劳快速失利取自力性。团队是没法掌握他们所依靠的效劳状况;
  • 缓存、舱壁、断路器战限流器等架贡ィ式取手艺有助于构建牢靠的微效劳架构。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

评论 2

蓝色之海  vip终身会员  发表于 2020-12-22 19:09:24 | 显示全部楼层
众里寻他千百度,蓦然回首在这里!

举报 使用道具

回复
玫瑰泪  vip终身会员  发表于 2020-12-22 21:18:53 | 显示全部楼层
支持,赞一个

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

138

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Archiver|手机版|java学习基地 |网站地图

GMT+8, 2021-6-23 07:52 , Processed in 0.527364 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.