写点什么

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

  • 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:4820715
用户头像

发布了 164 篇内容, 共 117.3 次阅读, 收获喜欢 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
回复
没有更多了
发现更多内容

Baklib知识分享|企业办公必备利器,在线协作文

Baklib

在线协作文档

记录第三天-Vue组件

默默的成长

Vue 前端 10月月更

P9力鉴!Alibaba9月最新出品776页JDK源码+并发核心原理解析小册

程序知音

Java 架构 jdk 并发编程 后端技术

全网疯传,SpringBoot笔记(全彩版)顶翻天

程序知音

Java spring 源码 springboot 后端技术

浅谈云安全和传统安全

HummerCloud

云计算 云原生 云安全

VUE 组件的计算属性

默默的成长

Vue 前端 10月月更

设备端零改动迁移实战——实践类

阿里云AIoT

安全 物联网 开发工具 迁移 企业实例

Baklib知识分享|制作网站FAQ需要注意哪些内容?

Baklib

Vue-监听使用方法和过滤器

默默的成长

Vue 前端 10月月更

【Go】gitlab 内部 Go 组件 Module 私有化

非晓为骁

go语言 包管理 go module go mod

我决定以后一直使用Eclipse了 因为它也可以安装集成PyDec插件来实现Python开发了 哇哈哈哈

Geek_yx5md7

Python 开发环境搭建 eclipse+pyhton Python编译器 新手学编程

多图详解kafka生产者消息发送过程

石臻臻的杂货铺

Kafk Kafka实战 10月月更

连接团队知识孤岛,优化团队工作流程

Baklib

知识管理 知识库

又一家!天数智芯天垓100 产品卡与龙蜥操作系统完成产品兼容互认证

OpenAnolis小助手

开源 适配 龙蜥操作系统 天数智芯 兼容

【融云出海白皮书免费看】出海洞察之美国的「高线市场模型」

融云 RongCloud

互联网 数据 模型

【转载】Byzer + OpenMLDB 实现端到端的,基于实时特征计算的机器学习流程

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

开源机器学习数据库 OpenMLDB:线上线下一致的生产级特征平台

第四范式开发者社区

人工智能 机器学习 数据库 特征 开源、

企业级低代码中“自动化工作流”的5大优势!

优秀

自动化 工作流 企业级低代码

Github星标57.9K!阿里巴巴Java面试突击汇总(全彩版)首次公开

程序员小毕

程序员 程序人生 JVM 多线程 Java 面试

2022 Java零基础必备 简单易学 Eclipse免费下载安装+JDK环境搭建一站式捆绑服务到底的教程 足够全、足够详细、足够劲爆 最关键可以一直让你免费使用!

Geek_yx5md7

eclipse 工具 开发工具 环境搭建 Java 开发

活动预告 | AI for Good 2022 峰会

第四范式开发者社区

机器学习 数据库 开源 时序数据库 特征

Vector、ArrayList、LinkedList的区别

zarmnosaj

10月月更

澳鹏Appen田小鹏博士:以高质量数据赋能AI驱动的元宇宙时代

澳鹏Appen

人工智能 AR/VR 训练数据 元宇宙 数据训练

六个方法教你如何搭建产品的在线帮助中心

Baklib

产品 帮助中心

重磅 | 九科加入麒麟生态图谱,携手共建自主可控信创生态

九科Ninetech

数字经济时代,企业应该如何搭建数字体验平台(DXP)?

Baklib

客户体验管理

同行四载,法大大携手SAP共筑数智未来

ToB行业头条

一颗石榴给QA带来的启示

BY林子

软件测试 敏捷测试 测试工程师 敏捷QA

活动预告 | Feature Store Summit 2022

第四范式开发者社区

机器学习 数据库 开源 时序数据库 特征

五面腾讯,六h灵魂拷问,终拿下 58W offer

程序知音

Java 腾讯 java面试 后端技术 Java面试八股文

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