淘宝应用柔性架构的探索

导读:随着淘宝业务的飞速发展,微服务架构在持续演进的过程中,也受到了越来越多的挑战:如同步模型带来的资源利用率有限、依赖调用并发度有限、下游故障引发应用自身出问题;又如静态限流随着业务代码的演进、依赖拓扑的变化、部署环境的调整,而造成过时引起的稳定性隐患等挑战。

ArchSummit(全球架构师峰会)上淘宝高级技术专家——泽彬分享了为应对这些挑战,淘宝基础服务在淘系架构升级上(代号 Tango :Taobao Architecture Next GeneratiOn )对这些问题的认识以及让应用面对突发问题时更具柔性(应用柔性架构)的一些探索。

Reactive 全异步化

当前我们的微服务主要是基于同步的调用模型,带来了如下挑战:

  • 同步等待造成应用资源利用率很难进一步提升
  • 并发度有限,技术实现无法做到业务理想程度的并发,导致 RT 增加
  • 下游出现问题会导致应用本身出现问题(如应用等待下游响应的线程会被长时间阻塞)

为此,我们引入了基于 Reactive 编程模型,以全异步、可编排的能力,来应对上述挑战:

  • 通过全异步化使得资源利用率/性能进一步提升
  • 通过全异步化,编排能力,使对外调用的请求并发能够突破原有并发线程的限制,做到极致并发
  • 通过全异步化能力,使得应用在等待依赖响应的耦合资源从线程变成了回调对象,让下游出问题时对应用自身的影响变得十分有限,从而提升了应用本身的稳定性。

基于 Reactive 全异步的解决方案打通了全栈,使得应用能够进行全异步化升级。淘宝的一核心推荐应用,在上线后 QPS 上涨了 90%+,另一核心应用,上线后 RT 也下降了 40%。

关注稳定性

在全异步化解决方案落地的同时,我们也在持续关注着稳定性。业务规模不断的增加,对稳定性的挑战也在变得越来越大。尽管我们对稳定性非常重视,但有时还是难免因一些错误的判断而导致了稳定性问题。

比如,在某次大型活动中,我们的收获地址出现了一些短暂不可用问题;又比如,在另一次大型联欢活动中,我们的登录系统也出现了短暂的不可用问题。这两个经典的案例,都是在我们对应用的容量、活动的流量预估上出现了失误而导致的问题。

虽然通过限流,我们可以大幅度提升应用在流量方面的稳定性,但通过上述两个案例,以及业务的不断实践,我们认为,只使用静态限流,系统还是会因为一些不确定性因素而带来稳定性上的隐患和风险。

由不确定性而引发的问题

限流是保护应用稳定性的有力武器,应用在正确预估自身容量和外部流量的情况下,借助限流可以保护应用自身不被流量打垮,从而提高自身的稳定性,淘宝这么多年的活动,限流都起到了功不可没的稳定性作用。

随着微服务数量的增长,我们发现应用在使用静态限流时,也带来了一些稳定性的隐患 —— 静态限流 与 不断演进的应用之间存在着时间上的不匹配。换句话说,应用一旦设置了限流,只要应用不断的发展,静态限流就有可能面临着过时的风险。造成过时隐患和风险的因素主要包括:

1、业务演进/依赖变化引起的不确定性

业务一直在发展,我们的应用代码也一直在变化,很有可能昨天刚刚设置过的限流 QPS,在今天应用一发布,就已经不适用了。就算应用本身不发布,应用自身依赖的后端服务的拓扑不停的变化,也会引发应用能够承受的 QPS 发生变化,带来不确定性

2、流量模型发生变化引起的不确定性

应用和服务通常包含多种方法调用,每种方法调用消耗的系统资源都不同,这要求在对应用压测时的流量模型要足够的合理准确,才能找到有效的限流值,然而业务的流量模型往往也是在不断的变化,这也会为应用的 QPS 评估带来不确定性。

3、不同容器实例容量引起的不确定性

随着运维环境和方法越来越复杂,交付给业务的容器,也变得不确定,如我们的混部、CPU Sharing 。同时,同一应用的不同容器,很可能会有不同的容量,如同一个应用的不同容器,压出来的基线 QPS 都很可能有很大的差异。底层机器资源的不确定性,也为应用限流QPS 评估带来了不确定性

因此,针对应用的限流阈值设置,应用开发就会很纠结:

  • 如果设置的限流阈值偏保守(偏低),那么:有的机器资源使用率上不去,浪费机器,造成成本升高问题。
  • 如果设置的限流阈值偏乐观(偏高),那么:有的机器还没有达到限流阈值,就会被压垮,造成稳定性问题。

上述的不确定性,也是我们在大型活动前,进行封网的原因之一。

应用柔性架构升级

面对着如此多的不确定性,我们希望我们的应用本身能够具有一些『柔性』的特征,使得在面对不确定的场景突然出现时,应用仍能够承受这些变化,就像太极一样,能够做到以柔克刚。我们认为,应用架构要做到柔性,至少需要有以下特征(针对应用柔性架构的特征,我们也在持续的探索中):

1、故障容忍

  • 如使用隔离进行解决。阿里的异地多活单元方案,可以隔离地区出现的问题;微服务化提升了研发效率,同时也隔离了其他独立链路出现的问题;而我们提出的全异步化解决方案,也增加了上游对下游出问题时的隔离作用。

2、过载保护

  • 如使用自适应负载调节进行解决。来应对由于流量容量预估不准而带来的稳定性问题。

为解决上述提到的不确定性带来的应用过载隐患问题,我们引入了自适应负载调节来升级应用的过载保护能力,解决应用过载的稳定性隐患。

 

自适应负载调节

 

通过自适应负载调节来应对上述不确定性,使得应用能够就地实时的评估自身负载,让接受的 QPS 与处理能力同步,防止限流评估出错而导致的稳定性问题和资源利用率问题;同时,在应用接收到超高压时,单机压垮的 QPS 可提到更高。从而能够应对更高的突发流量,加固应用自身的稳定性。

整个方案的主要由两部分构成:

1、与应用整合的负反馈组件

  • 在应用的入口设置一个负反馈组件,根据应用自身的负载情况,对进入的请求进行针对性的拦截
  • 为了适用更多业务,此组件还支持服务权重,优先拒绝权重低的服务,使得在过载时,资源能够尽量往权重高的服务倾斜。

2、组件本身的快速迭代机制

  • 为了让方案本身能够在不同的场景下有效,我们从很多不同的维度展开,组合成多个场景,再通过自动化的场景压测,来快速进行算法在不同场景下的效果评估和改进,从而提升整个方案的迭代演进速度。

最终,整个方案沉淀了自适应负载调节的自动迭代平台,迭代出基于 CPU 的自动控制算法。

上线案例

淘宝某核心业务的应用,在一次大型活动压测中的效果得到验证:在某个机房的机器数比预期少 22.2% 的情况下,抗住了 130% 的压测流量。按照以往双十一的压测经验,在少这么多机器的情况下,这个机房的应用扛不住如此大的流量。

另一核心应用,由于担心不确定性原因,静态限流值设置的偏保守,在接入自适应负载调节后,限流值可以进一步提升,使得服务的有效 QPS 提升了 230%,同时应用的压垮 QPS 提升了 3 倍,在压测大流量过后,秒级恢复,迅速提供正常服务(原需 6 分钟+ )。

应用柔性架构升级 - 后续展望

为了让应用更具高可用,我们从故障的角度,围绕着从故障发生前的预防能力,到故障诱因发生中的防御能力,再到故障发生时的恢复能力,来打造应用的高可用能力,进行应用的柔性架构升级。

同时,针对自适应负载调节,目前的策略为就地拒绝,提高了稳定性,但仍有稳定性风险,后续我们需更进一步丰富策略,如结合集团的中间件产品,进行快速扩容/缩容操作;应用向上游反馈压力,使得压力从上游杜绝(分布式回压)等。同时,为了在应用的依赖出现问题时,仍能够有柔性能力,我们也会针对同步模型的应用,引入自适应的隔离/熔断能力,使得应用下游出现问题时,不会影响到应用本身。

应用高可用关注的是应用自身,除了应用高可用,我们也在积极推进淘系业务整体的高可用能力,比如在站点出现问题时,我们如何做到以最快的速度切换流量,恢复业务,最终提升整个淘系的高可用。更多关于应用高可用、淘系业务高可用的理解和落地,我们在持续地探索。

加入我们

欢迎加入淘宝基础平台基础服务团队,团队成员大牛云集,有阿里移动中间件的创始人员、Dubbo核心成员、更有一群热爱技术,期望用技术推动业务的小伙伴。

淘宝基础平台基础服务团队,推进淘系(淘宝、天猫等)架构升级(代号Tango),致力于为淘系、整个集团提供基础核心能力、产品与解决方案:

  • 业务高可用的解决方案与核心能力(应用高可用:为业务提供自适应的限流、隔离与熔断的柔性高可用解决方案,站点高可用:故障自愈、多机房与异地容灾与快速切流恢复)
  • 新一代的业务研发模式FaaS(一站式函数研发Gaia平台)
  • 下一代网络协议QUIC实现与落地
  • 移动中间件(API网关MTop、接入层AServer、消息/推送、配置中心等等)


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS13 一次Crash定位 - 被释放的NSURL.host

每年一次的iOS升级,都会给开发者带来一些适配工作,一些原本工作正常的代码可能就会发生崩溃。 本文讲到了一种 CoreFoundation 对象的内存管理方式在iOS13上遇到的问题。 1. 问题 iOS 13 Beta 版本上,手淘出现了一个必现的崩溃: …

面试官吐槽:“Python程序员就是不行!”网友:我能把你面哭!

最近几年,Python莫名火了起来,很多公司都想赶上这“莫名”的热潮,招聘到大牛人才。但是,最近一个HR在社交网站的吐槽又火了:那么问题来了,市面上为什么鲜有企业满意的优秀的Python程序员?企业到…

python3-pandas 数据结构 Series、DataFrame 基础

Pandas 应用 Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 数据结构 Series 是一种类似于一维数组的对象&#xf…

十年磨一剑 | 淘宝如何打造承载亿级流量的首页?

阿里妹导读:手机淘宝作为整个互联网领域旗舰 APP 之一,装机量和用户访问量都是名列前茅的。而首页作为打开手机淘宝的门面,是淘宝电商领域的主要流量入口和服务消费者的核心阵地,其业务的复杂性之高、系统的稳定性之重都有着极高的…

switchhosts 没有修改hosts的权限解决方案

使用swtichHost工具切换开发环境时候提示没有权限问题,如下图。。 解决方案有两点 1、进入 C:\Windows\System32\drivers\etc右键点击hosts的属性查看 属性的只读是否被勾选了,如果被勾选了将勾选勾去掉 上述完成后以管理员身份运行(管理员…

闲鱼亿级商品结构化背后的思考和演进

1. 缘起 闲鱼是一个典型的C2C场景的闲置交易平台。每个在闲鱼的用户都能享受到自由交易的乐趣。在这里,可能你只要简单的输入商品名,商品价格,库存等信息就能完成一个商品的发布。即便是发布以后,你也可以随时修改价格&#xff0…

QingStor NeonSAN跻身四强 新风口下的青云QingCloud正在厚积薄发

人类以日新月异的速度刷新着科技的成果,其中存储的发展历史尤其悠久,堪称万年进化史。自文明诞生以来,我们就一直在寻求能够更有效存储信息的方式,从4万年前的洞穴壁画、6000年前泥板上的楔形文字,到今天正在普及的SSD…

python3-pandas DataFrame 索引、bool索引、pandas 字符串方法

1、DataFrame 索引 1.1 普通索引取值 pandas 取行或者列的注意点: 方括号写数组,表示取行,对行进行操作方括号写字符串,表示取列,对列进行操作 import pandas as pd import numpy as np # pandas 取行或者列的注意…

记一次Cassandra Java堆外内存排查经历

背景 最近准备上线cassandra这个产品,同事在做一些小规格ECS(8G)的压测。压测时候比较容易触发OOM Killer,把cassandra进程干掉。问题是8G这个规格我配置的heap(Xmx)并不高(约6.5g)已经留出了足够的空间给系统。只有可能是Java堆…

程序员内功修炼系列:10 张图解谈 Linux 物理内存和虚拟内存

来源 | 后端技术学堂责编 | Carol封图 | CSDN 付费下载于视觉中国我们都知道,程序可没这么好骗,任你内存管理把虚拟地址空间玩出花来,到最后还是要给程序实实在在的物理内存,不然程序就要罢工了。所以物理内存这么重要的资源一定要…

阿里高级技术专家方法论:如何写复杂业务代码?

阿里妹导读:张建飞是阿里巴巴高级技术专家,一直在致力于应用架构和代码复杂度的治理。最近,他在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,是一个新课题。结合实际的业务场景…

Android Studio 安装教程

注意安装之前请配置好java 和 Android SDK 1、下载 官网地址: https://developer.android.google.cn/studio/ 点击下载后,需要同意协议: 2、安装 1、双击程序 2、一路 next,如果想修改路径可自行修改。 3、安装完成点击Fi…

Schedulerx2.0工作流支持数据传输

1. 前言 Schedulerx2.0是阿里中间件自研的基于akka架构的新一代分布式任务调度平台,提供定时、任务编排、分布式跑批等功能,具有高可靠、海量任务、秒级调度等能力。 Schedulerx2.0提供可视化的工作流进行任务编排,该文章将详细介绍如何使用…

应用实时监控 ARMS 上线用户行为回溯功能

随着前端技术日新月异迅猛发展,为了实现更好的前端性能,最大程度提高用户体验,支持单页应用的框架逐渐占领市场,如众所周知的React,Vue等等。但是在单页应用的趋势下,快速定位并解决JS错误却成为一大难题。…

Android Studio 创建第一个Android工程项目

1、打开Android Studio 2、点击 New Project 选择 Empty Activity 3、点击 Next 4、点击 Finish 等待加载完成,取决于网络,第一次加载可能要很久。。。 5、下载完成 可以在右上角切换为 Project 模式 6、创建一个虚拟设备 https://www.bilibili…

我竟然混进了 Python 高级圈子!

现如今,计算机科学、人工智能、数据科学已成为技术发展的主要推动力。无论是要翻阅这些领域的文章,还是要参与相关任务,你马上就会遇到一些拦路虎:想过滤垃圾邮件,不具备概率论中的贝叶斯思维恐怕不行;想试…

Tablestore + Blink实战:交易数据的实时统计

背景 交易数据的实时统计是电商网站一个核心功能,可以帮助用户实时统计网站的整体销售情况,快速验证“新销售策略”的效果。我们今天介绍一个基于表格存储(Tablestore)实现交易数据的实时计算,给大家提供一个新使用方式。 Tablestore作为在…

无标注数据是鸡肋还是宝藏?阿里工程师这样用它

阿里妹导读:针对业务场景中标注数据不足、大量的无标注数据又难以有效利用的问题,我们提出了一种面向行为序列数据的深度学习风控算法 Auto Risk,提出通过代理任务从无标注数据中学习通用的特征表示。这种思想与目前 NLP 领域前沿的 Bert 等预…

Android 控件 - TextView

1、TextView https://www.bilibili.com/video/BV13y4y1E7pF?p3 1.1、layout_width、layout_height match_parent:表示让当前控件的大小和父布局的大小一样,也就是由父布局来决定当前控件的大小 wrap_content:表示让当前的控件大小能够刚好…

为什么选择Cassandra

cassandra概况 为什么选择Cassandra?cassandra到底有那些令人印象深刻的特点呢?不防我们先来看下cassandra目前的大体概况。 理论扎实,师出名门 cassandra不仅吸收了dynamo论文中的如何做分布式,如何做副本复制,故障…