技术视频观后感之《淘宝应用架构升级——反应式架构的探索与实践》

视频地址:https://time.geekbang.org/dailylesson/detail/100033220

(给极客时间做个免费广告:上面这个视频来自极客时间的《每日一课》。最近一段时间开通极客时间企业账号可以免费享受两个月的《每日一课》服务)

这个技术视频是介绍淘宝是如何落地全异步化技术,以及获得的收益,还有关于自适应负载调节方面的内容。完整的 PPT 可以在这里(https://www.infoq.cn/article/P1S7UOYH-pQZWa53zSJL,文章末尾)下载。

一、内容大纲

下面是我总结的这个技术视频的内容大纲:

  • 实施全异步化改造的效果
  • 全异步化改造的背景
  • 全异步化的技术选型
  • Reactive 技术的选型
  • Reactive 技术的落地难点及解决方案
  • 全异步化的延伸:负载自适应

二、具体内容

接下来大致介绍一下视频的内容,其中会加入我的解释、看法和思考。

1. 全异步化技术实施效果和背景

首先介绍的是淘宝在实施全异步化改造后的效果。最先看到的是 RT 的降低和 QPS 提升。全异步化在平时不会降低 RT、提高 QPS。但异步化有助于提升系统的两大能力:Elastic 和 Resilient,前者反映了系统应对压力的表现,后者反映了系统应对故障的表现。在大促时,系统会承受更大的压力、遭受更多的故障。在这种情况下,全异步化的系统会表现出比传统同步方式的系统有更低的 RT、更高的 QPS。

异步化效果

除了提高资源利用率和并发能力,全异步化还能实现链路上下游的故障隔离。

背景

2. 全异步化技术选型和落地

如何实现全异步化?Future、Callback 都是老技术,不完美。Future 在异步方面改变有限,Callback 在编排能力方面有 Callback Hell 这样的严重短板。Project Loom 愿景很美好,但距离发布还有好几年的时间(不能说跳票,毕竟也从来没宣布什么时候发布)。目前实现全异步化最理想的技术就是 Reactive Streams(https://www.reactive-streams.org/)。

全异步化技术选型.png

淘宝选择 RxJava 实现 Reactive。最大的原因我猜是 RxJava 技术出现较早。如果我现在选择,会更倾向于 Project Reactor。毕竟最近两年 Netflix 将很多开源技术停止了维护,所以选择一个由成熟强大的开源社区维护的技术更有利于长远发展。至于稳定性和普及性,这两年随着 Spring 5 和 Spring Boot 2 的成熟,以及整个 Spring 技术生态全面支持 Reactive,也不会是问题。

技术选型

但技术选型只是第一步,落地实施 Reactive 有非常多的困难。困难分两部分:技术和推广。

技术难点

先说技术方面,落地 Reactive 主要有如下几个难点:

  1. 中间件改造:如何是 RPC、MQ、链路跟踪、数据库等中间件支持 Reactive 技术
  2. 线程模型:统一管理线程设置
  3. 防止线程阻塞:阻塞 Reactive 核心线程非常危险
  4. 上下文传递:ThreadLocal 不再有效

这四点中,我认为以1、3、4点最关键。

Reactive 技术关键点.png

第一点:中间件改造

目前 Spring 帮我们做了很多,如 Spring MVC、Spring Data、Spring Security 等都已支持 Reactive 技术。但是像 Dubbo、RocketMQ、MySQL 等技术对 Reactive 的成熟支持还需时日。因此,目前落地 Reactive 的项目对所采用的技术还是有所限制。

第三点:防止线程阻塞

Reactive 技术所使用的线程数一般只需要 CPU 核心数的两倍,这也是默认配置。这样,如果一旦这些线程被阻塞,那整个系统很快就会失去响应,后果很严重。所以,在采用 Reactive 技术之后,线程阻塞要彻底避免。但是这又是一件防不胜防的事情,自己的代码尚且不容易完全避免引入阻塞,又如何避免其他人写的组件和第三方类库所引入的阻塞呢?

在线程阻塞检查技术方面,主要有以下几种:

阻塞检测.png

最近 Project Reactor 提供了一个新解决方案:BlockHound 技术(https://github.com/reactor/BlockHound)。上面的表格中似乎没有提到 BlockHound,后续我会跟进研究。

第四点:上下文传递

ThreadLocal 在 Java 技术中广泛使用,缓存、事务、链路跟踪,还有很多其它技术都采用了 ThreadLocal。但使用 Reactive 技术后,上下文信息就不能在 ThreadLocal 中传递了。这方面其实主要也是设计中间件技术的改造,但也有很多业务系统直接使用了 ThreadLocal,同样需要改造。这部分工作成本不低。

推广难点

技术难点主要是中间件团队的工作,推广部分主要是业务团队的工作。要想推广 Reactive 技术,首先要让团队从上至下认识到 Reactive 技术的好处。同时,还要让直接参与改造的同学能从 Reactive 技术改造的工作中感到成就感。

这里我认为一个比较合适的切入点是全链路压测和全链路故障演练。通过压测和故障演练,我们能找到系统目前所存在的瓶颈和问题,针对这些瓶颈和问题,通过实施 Reactive 改造,让大家看到收益。这样可为 Reactive 技术改造铺平道路。

思想上铺平了道路,还有其它难点。其中最大的难点是 Reactive 技术对业务逻辑不友好。这方面在我之前的文章中有介绍。其中一个解决办法就是引入 Kotlin Coroutine 技术。

3. 自适应负载调节

柔性架构

即便实施了 Reactive 技术改造,提升了系统的资源利用率和弹性,实现了上下游故障隔离,但在硬件条件不变的情况下,系统能力终归是有限的。这便是我们为何要做全链路压测的原因。在大促来临之前,我们需要通过全链路压测得知系统的瓶颈在哪里。但事事难料,大促实际流量总是很难估计准的,换言之就是不确定性。

自适应负载调节.png

这些不确定性综合在一起,使得资源评估变成一个很难做好的事情。一个服务有多个接口,这些接口在大促期间流量是多少?这些接口流量的比例是多少?系统能力是多少?我应该为大促准备多少服务资源?这些服务所依赖的服务的这些情况又是如何?

上面这些问题综合在一起,当系统和业务越来越复杂之后,便会变得不可解。所以,我们需要系统具备自适应负载的能力。

接下来视频介绍的是如何实现负载自适应。

柔性架构后续展望.png

这里面最关键的是预测算法,预测算法参考了系统自动化控制相关技术,好坏可以从三个维度评估(这里照抄一下原文):

  • 稳定性:有压力时,经过一段时间,CPU 最终趋于某个值附近稳定,而不是发散的
  • 准确性:处于稳定状态时,CPU 的稳定性值与目标值的误差越小越好
  • 响应性:有压力时,从一个稳定状态过渡到另一个稳定状态的抖动服务和时间越小越好

负载自适应,简单说就是将过去容量评估的工作变为自动化、智能化,再结合系统自动伸缩、Reactive 技术的背压、系统自动化配置等技术,使得系统对大流量活动的支持更轻松、更稳定。

如果想进一步了解负载自适应,可阅读这篇文章:淘宝如何保障业务稳定性——诺亚(Noah)自适应流控 https://mp.weixin.qq.com/s/ePWqUiZcEy52mUHb4WbcSA

三、后记:后续思考

阿里的这个分享可以说是干货满满。From Reactive, More Than Reactive。互联网公司在面对业务的快速变化、流量压力的难以预测、故障的突如其来等种种挑战时,简单增加集群规模,配置静态的限流熔断,是无法满足业务发展要求的。这就是全异步化和负载自适应的用武之地。

回到我目前所负责的工作,Reactive 技术和负载自适应这两方面,对于前者,计划在上半年对一个业务接口进行 Reactive 技术改造。而对于负载自适应,会进行初步的思考和探索。但因为要补的课还有很多,所以具体实施计划尚不确定。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容