速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

全面异步化:淘宝反应式架构升级探索

  • 2019-01-15
  • 本文字数:3015 字

    阅读完需:约 10 分钟

全面异步化:淘宝反应式架构升级探索

2018 年初,淘宝开始尝试对整体架构进行升级,经过近一年的探索,实现了全面异步化,这一架构升级在部分应用中取得了 40%以上的性能提升,同时也为后续的回压推进打下了基础。负责该项架构升级的是淘宝技术专家许泽彬,他在 2018 领域驱动设计中国峰会上做了《淘宝应用架构升级——反应式架构的探索与实践》的分享,InfoQ 也趁此机会对他进行了采访,了解了更多细节。


2018 领域驱动设计中国峰会(DDD2018)是 ThoughtWorks 发起的技术会议,旨在给国内的 DDD 实践者们提供一个互相交流、分享自己团队的成功经验的机会的平台。


许泽彬是淘宝技术专家,目前负责淘宝应用架构升级。曾参与淘宝用户增长设施与平台建设,负责过分布式调用链跟踪框架和系统“鹰眼”,曾经是阿里分布式数据库中美异地机房数据同步的核心开发,也是阿里旗下开源项目 otter 和 canal 的核心开发者。


淘宝此次架构升级,重点在于将同步的架构改为异步、面向流的开发,以便为后续的回压方案打下基础, 这里所说的回压方案要解决的问题是:应用在突发流量下的稳定性保证,以及最大化提升资源利用率。 许泽彬将其称为反应式架构。


经过近一年的推进,反应式架构已经在生产环境落地,在 2018 年双 11 万亿级大规模处理量下,架构升级对多个核心应用进行了验证落地,取得了超出预期的效果:


  • 其中『猜你喜欢』应用上限 QPS 提升 96%,即只需一半的机器就能支撑现有业务;

  • 而另一核心应用『我的淘宝』实际线上响应时间下降了 40% 以上,意味着用户可以更快得到响应。


在淘宝内部,这仅仅是回压——突发流量下的稳定性以及最大化提升资源利用率方案 —— 刚刚迈出的第一步。

什么是反应式架构

反应式架构里的反应式,就是 Reactive,国内对这个词的翻译并不统一,有的叫响应式,有的叫反应式。许泽彬认为,这里将其称为反应式更为准确,响应式更多用于前端的界面中,对应的英文是 Responsive。


反应式架构与一般架构相比,其反应体现在:


第一个,对用户有反应,对用户有反应我们才说响应,一般我们说的响应,基本上都说得针对跟用户来交互。


第二个,要对失败有反应,应用失败了系统不能无动于衷,等着它挂掉,要有反应。


第三个,要对容量和压力变化有所反应,比如说淘宝的秒杀,系统需要反应来保证对用户的响应性,再如那个当流量降下来,将系统缩容,可以节约成本,这也是一种反应。


第四个,对输入有反应,响应系统的输入,也可以叫做消息驱动。


要做到反应式,需要做到三点:


  • 适应性,也就是发生失败能恢复回来,无论是系统、网络、代码出现了问题都能恢复。

  • 弹性,这点主要是应对流量的变化,弹性的前提是做到可伸缩性 Scalability,从软件设计上,要做到去中心化;同时,在运行时,要感知节点当前的系统负载,将压力往上游进行反馈,做到系统可以感知链路级别的节点压力,使得系统可以针对整体压力进行有目的地扩容缩容。这样才能够做到真正的弹性,根据系统负载进行扩容或缩容,这也是淘宝的回压方案在后续所需要支撑的场景。

  • 消息驱动,有了消息驱动才能比较好的做到上面两个点。在反应式架构里,以前这点叫做事件驱动,后来改为消息驱动,消息驱动强调无阻塞、无 callback,所以不会有线程挂在那里,不会有持续的资源消耗。同时,事件驱动或消息驱动都是异步化,而异步化会将操作系统中的队列情况显式地提升到了应用层,使得应用层可以显式根据队列的情况来进行压力负载的感知,这对于淘宝后续的回压方案非常重要,而要做到这点,就需要异步了。


反应式架构中的核心概念是“流”,流就是面向数据的顺序串行执行的一系列操作组合,它同传统的编程相比,将业务逻辑导致数据改变,变成了操作改变数据,反过来影响业务逻辑的改变。面向流编程就是面向数据编程。


面向流的开发的优势主要体现在:


  • 提供大量强大的操作符,包括创建、过滤、转换等。声明式表达比过程式编程更加完备、高级、快捷。

  • 在并发控制方面,不同的流之间无依赖,通过切换 Scheduler 就可以自动多流并发,而业务按照语义编写,可以更友好的并发控制,更优的维护性和性能。

  • 更高的资源利用率。通过更少的上下文切换、更低的竞争,可以降低负载,提升资源的有效利用率。

  • 流可以加强分布式架构的治理能力。流引用可被远程化,从而实现系统级的流式贯通,而流提供的更好的回压、三角模式透传,以及天然的截面编程能力等,可以给架构治理提供更好的帮助。目前淘宝正在推进回压的方案,就是为了给系统在稳定性和资源利用率上提供更高级的治理手段。


淘宝反应式架构实践

淘宝之所以要做架构升级,是因为现有架构存在一系列问题:


  • 同步等待造成资源浪费,现有的同步模型线程多负载高,导致资源利用率较低。

  • 架构的并行度有限,无法实现纯业务依赖并发,微服务化让问题更加凸显,服务增加造成响应时间累积。

  • 而响应时间累积又带来一些连锁反应,包括为了降低响应时间而过早的引入 cache,每个服务都需要设置超时来解决长时间无响应问题,而这些带来维护成本的提升,也提高了业务实现的复杂度。

  • 同时,在应用系统无事先准备的情况下,面对突发大流量时,很容易被打挂,造成稳定性问题,导致用户体验严重下降。


而经过调研后,淘宝架构团队认为使用反应式架构是当前可行的一个方案。原因包括,Java 8 已经逐渐普及,因为它包含对 Lambda 的支持,这让开发者对 Lambda 的接受度大大提高;同时 Reactive 相关的业务框架在业界已有成熟的实现,RxJava 已经广泛在大小公司中应用;最后,包括 Java 9(引入 Reactive Sreams 规范 API)、Spring 5(引入 Reactor/WebFlux)、Spring Boot 2 都开始拥抱 Reactive,说明反应式编程的确是趋势。


整个方案对业务架构的升级主要包括编程框架、中间件,以及业务方的升级。中间件的升级,包括服务框架(RPC)、网关、缓存、消息(MQ)、DB(JDBC)、限流组件、分布式跟踪系统、移动端 Rx 框架。


这其中值得注意的包括,对服务框架的升级,流式实现将在 Dubbo 3 中放出;DB 中的异步集成使用 Ali JVM 协程或用线程池实现;移动端为了支撑已有的 iOS 应用,淘宝开发了 AliRxObjc 并即将开源。


最后,改造后的架构如图:



实施反应式架构的难点


反应式架构在各个模块上基本都有成熟的方案,除了个别领域如数据库,基本没有特别的瓶颈。实施反应式架构的难点主要在于工程师的思维转换,因为之前工程师主要使用同步式的思维写程序,突然要换成以流的方式编写,思维必须要做转换。


因此,要做到全面异步化,组织必须从上到下全力支持。淘宝的做法是,成立虚拟小组,在每个业务线里挑选能力比较强的同学统一进行异步式的培训和指导,之后由他们在团队内部推广。


同时,要让业务方有动力去做异步化的改造,需要让他们认识到这么做的好处,因此异步化改造首先要做出一些标杆性的成绩出来。这中间的策略包括选择面临瓶颈的地方,业务逻辑简单的, 以及业务压力不大的应用来进行试点,一旦做出成绩,就可以给其它团队以信心和动力。

淘宝应用架构升级后续规划

目前,淘宝的异步化改造在技术上已经大部分完成,后续的规划主要包括:


  • 回压的实现

  • 分布式上下游的联动回压,解决高并发压力下的响应时间、有效请求数、系统自恢复、链路短板自发现等问题,解决系统在突发流量下的稳定性问题,以及提高资源利用率。

  • 自适应回压解决静态配置无法应对系统波动变化问题

  • 实现全异步/流式为核心的服务框架,让业务方做到异步优先;

  • 考虑引入 Kotlin 协程,它的异步设计符合过程式的编程习惯。


淘宝的回压方案,目前正在推进和实施的过程当中,后续他们也将会有更多的经验分享出来,欢迎关注。


2019-01-15 09:4820231
用户头像

发布了 164 篇内容, 共 108.0 次阅读, 收获喜欢 392 次。

关注

评论 8 条评论

发布
用户头像
“QPS 提升 96%,响应时间下降了 40% 以上”,之前的系统架构和工程师得有多垃圾,还是过于夸大吹牛逼的成分了,我感觉是后者
2019-09-06 16:11
回复
同意观点。如果之前的系统cpu利用率本身已经很高了,你QPS还能提升这么多?
2020-03-20 16:09
回复
限定的是那两个应用,QPS说的还是上限,响应时间也没说是max or avg
2020-06-12 17:30
回复
用户头像
阿里 JVM 不是有协程吗?为什么淘宝还搞反应式?协程不好用?
2019-05-29 12:46
回复
用户头像
playframework一直在践行反应式开发,虽然是小框架,但是思路跟楼主是一样的。
2019-01-18 09:34
回复
用户头像
好文章,收藏了
2019-01-16 10:45
回复
用户头像
mark
2019-01-15 20:29
回复
用户头像
这篇文章回答了什么是反应式架构的概念。又举了很多淘宝的例子。真是一篇不可多得的文章。
反应式编程是未来的趋势。作为Java技术栈的朋友们,这是下一个金矿。
希望能放出Slides或PPT,了解细节。
2019-01-15 11:00
回复
没有更多了
发现更多内容

世界读书日 | 开发者必读书单重磅来袭,华为云DTSE专家天团力荐

华为云开发者联盟

华为云 华为云开发者联盟 企业号2024年4月PK榜 世界读书日 开发者必读书单

GLM国产大模型训练加速:高效性能与成本优化的实践

百度开发者中心

人工智能 深度学习 大模型

出海不出局 | 小游戏引爆高线市场,新竞争态势下的应用出海攻略

融云 RongCloud

面试不会算法和数据结构,经典面试题讲解来了!

霍格沃兹测试开发学社

如何通过二维码追踪物品流转情况?添加这个组件即可

草料二维码

二维码 草料二维码

第六届科技无障碍发展大会(2024TADC)

信息无障碍研究会

MES系统解决方案,MES系统主要能解决什么问题

万界星空科技

数字化 生产管理系统 mes 万界星空科技 车间管理

HashData获得华为鲲鹏Validated认证 信创版图持续壮大

酷克数据HashData

认识一下JavaScrip中的元编程

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号2024年4月PK榜

Anon Network:基于 Ator Protocol 的 DePIN 匿名互联网

大瞿科技

MES管理系统与其他系统的集成

万界星空科技

数字化转型 系统集成 mes 万界星空科技

Apifox 最新功能更新:OAuth 2.0 鉴权、多分支Mock及更多

Apifox

程序员 前端 后端 Apifox

Stable Diffusion中的常用术语解析

程序那些事

人工智能 程序那些事 openai

利用jd.item_get API获取商品信息,打造可读性强的商品介绍

技术冰糖葫芦

API 接口 API 文档 pinduoduo API

Prompt工程师压箱底绝活——Prompt的基本组成部分、格式化输出与应用构建

百度Geek说

企业号 4 月 PK 榜 Prompt

金三银四 面试准备 数据结构面试题,编程与算法经典面试题

测试人

面试 软件测试 求职

仓储管理解决方案:混合低代码与定制开发,实现灵活性与效率的完美结合

天津汇柏科技有限公司

低代码开发 软件开发定制 仓储系统

软件测试学习笔记丨Selenium网页frame

测试人

软件测试

QCN9274 vs QCN9224 chip performance comparison-wireless communication innovation

wifi6-yiyi

5G qcn9274 QCN9224

Giants Planet 宣布推出符文,建立在坚实价值的基础上

西柚子

驼峰与下划线在python中转化

麦兜

文心中国行走进成都!4月24日一起把握大模型时代的产业新机遇

飞桨PaddlePaddle

百度 BAIDU 百度飞桨 文心大模型 文心中国行

信创国产化替换势在必行,“重复造车轮”应避免

FinFish

国产化 小程序容器 信创化软件 信创化

卡片式笔记系统BYEAP介绍

zhumingwu

lerna-lite 轻量化 monorepo 管理利器

小鑫同学

LLaMA 2语言大模型的微调策略:LoRA与全参数选择

百度开发者中心

人工智能 大模型 llama2

全面异步化:淘宝反应式架构升级探索_架构_徐川_InfoQ精选文章