首页 人物 内文

164次练习「失败」

2020年11月12日 文/ 李弘 编辑/

应对双11的技术体系,与12年双11滚雪球般增长的数字一同迅速生长起来。随着承载的消费者、商家不断增加,它变得越来越庞大、复杂,每年双11,最大的考验是,如何在保持创新性的同时平衡稳定性? 「建立面向失败设计和拥抱失败的文化。」这是可能的答案。

文|李弘

「失败是必然的,随着时间的推移,一切终将失败。」这是程序员中亭很喜欢的一句话。

在长达1年多的时间里,这名阿里云工程师在全力以赴推进阿里巴巴一个「面向失败」的特殊项目。

2020年10月24日快凌晨2点,中亭和上百名工程师聚集在杭州一个报告厅中。这里是常被外界提及的西溪园区1号楼7层,每年备战双11的「光明顶」。大家围坐在一张又一张办公桌前,电脑屏幕亮起,好几台电脑显示电量即将耗尽。

程序员正紧张备战双11

模拟双11流量洪峰时刻的全链路压测即将进入尾声。周围窗帘全部拉满,前方,一张超过10米长的大屏闪烁着深蓝色的光焰,交易额的曲线没多少波澜,像一艘在大海里平稳行驶的船。

阿里零售技术事业群总裁范禹悄悄从指挥室走出,他掏出手机,按下了一个按钮。

有人叫了一声「怎么回事?」几乎所有人抬头望向大屏幕。

原本平稳的交易曲线像撞上了悬崖,瀑布一般飞泻而下。指挥沙盘上,阿里位于张北的几个机房飘红,流量成功率降到了60%——这意味着一万笔订单中,有4000笔会交易失败。

除了中亭和极少数几个人,没人知道这是一场内部突袭。

范禹按下的突袭APP,由中亭和同事们研发。这个按钮,开启了阿里技术团队在真实世界的惊涛骇浪中一键压测的序幕。

刚发起完突袭的范禹和霜波

一只捣乱的猴子

从事技术风险工作的中亭,一直在思考一个问题,「风暴来临时,我们应该怎么应对?」

看似平静的航行中,只有坐在船头的人,能看到舱外的枪林弹雨。

由比特组成的赛博世界有一条规律与物理世界相同:在一个孤立系统里,如果没有外力做功,其「熵」,也就是混乱度,总是会不断增大。

当「熵」积累到一定程度,各种各样的「失败」,也就发生了。这是必然事件,不是概率事件。

阿里巴巴的技术体系,与12年双11滚雪球般增长的数字一同迅速生长起来。随着承载的消费者、商家不断增加,它变得越来越庞大、复杂,每年双11,最大的考验是,如何在保持创新性的同时平衡稳定性?

「稳定压倒一切」每年在技术部门备战区都随处可见,但这又是一项前所未有的世界级难题。

「建立面向失败设计和拥抱失败的文化。」中亭的解决思路是主动制造更多混乱,将还未发生的「失败」在可控半径内提前爆破,从而给系统主动「降熵」。

背后的机制设计被称为「混沌工程」,它试图模拟一只捣乱的猴子在系统中上蹦下窜,直到搞挂系统。

从2016年备战双11开始,阿里巴巴开始定期进行模拟故障演练。

今年,随着对稳定性的要求进一步提高,有人提议「设计一个按钮」,「演练」从此升级成了「突袭」,并在阿里经济体各业务线全面推行:只要各个团队技术负责人按下「发动突袭」的按钮,一场真刀真枪的战斗将在针对阿里自身技术体系的战场上发生——「真」不仅意味着一线工程师不知道这是真实故障还是突袭,也意味着一旦恢复不到预期,给业务带来的损失也是真金白银。

动手设计突袭APP前,阿里集团技术风险部的产品专家汉英玩了几十款策略游戏。最后,她和同事设计出借鉴游戏架构的APP,有历史积分排名,有冠亚军领奖台,以此鼓励突袭应对结果不断进步的业务线。

技术团队的模拟战场取名为WorldBox,既是「上帝沙盘」的意思,又谐音「我的box」。「每个人不一定都是CEO,但他都有一个自己小小的技术世界。」汉英说。

WorldBox模型

在突袭中,技术团队被分为蓝军和红军,蓝军负责出其不意发起进攻,红军则竭力抵抗。

APP上有一个供蓝军使用的火药库,里头装着威力不同的武器,有的是「炸弹」,比如将一个机房全都断网,有的是「针管」,比如在某个小业务上注入一点故障,有的是「小刀」,偷偷切断某些产品的对外连接。将弹药丢进战场后,红军需要迅速将被困业务救出来。

负责发动袭击的蓝军分为两种:一种是技术风险蓝军,可以理解为「职业蓝军」;一种是散落在业务部门的业务蓝军,可以理解为「兼职蓝军」。

相比处于防守方的红军,蓝军似乎占据了有利地形。但在突袭开始推广后,蓝军在内部舆论中并不占优。

「业务好端端的,为什么总是要搞我们?」刚开始发动突袭后,蓝军经常收到红军尖锐的质疑,「劳民伤财」是第一大反对理由。甚至有不少红军直接给张勇和CTO程立写邮件吐槽、抗议。

剑拔弩张相当长一段时间后,「突袭」机制才逐渐被红军接受。

硬汉红军

每次突袭来临,红军方面对的都是一场与时间厮杀的硬仗。

7x24小时由中国区和海外区同学轮值的阿里运行指挥中心,会最早收到异常信号。运行指挥中心已将自动化做到极致,但每天仍需一位同学监控、管理海量的数据变化。

阿里运行指挥中心

数字反常波动,会导致系统自动发出「叮叮」的报警声。运行指挥中心负责人玄烨对这个提示音太熟悉了,如同「长期的一个习惯动作」。每月2次的值班日中,他平均会听到200多次。一个小时没响起铃声,他会陷入自我怀疑:是不是这个系统有问题?有次坐地铁,列车到站的铃声和他们的报警声很像,他还恍惚了一下。

他要做的是,像条件反射般从无数杂音信号中分辨出真正的故障信号。

红军应对故障的基线是「1-5-10」 :1分钟发现,5分钟定位,10分钟恢复。第一个环节,1分钟内发出故障警报,几乎已是极限挑战,但玄烨和同事数年来很少失守。

每天遇到真正故障的频次大概是七八次,操作手册烂熟于心,不过面对「有时一个月才出现一次」的P1或P2级重大故障,玄烨仍然会「心跳一下」,「无论何时都不敢松懈」。

收到警报后,业务方红军同样要随时响应。阿里云网络团队的红军云州每周要回一次在昆明的家。有几次在去机场的路上接到故障通知,他立刻找地方紧急停车处理;登上飞机关机前,他一定在钉钉上做好交接;刚一落地,他即刻连上网络,担心一堆消息涌来。

为了避免将家人吵醒,阿里集团技术风险部负责人霜波常年在睡觉时戴手环,电话一来手环就会震动。

由于需要极强的心理素质,红军普遍是「硬汉型」,男生占绝大多数,不过统筹负责人霜波是女生。「喜欢解决问题」是他们普遍的特征,不少人家中有模拟飞行器,阿里新零售稳定性负责人道延在公司空闲时会习惯性地玩魔方,看到魔方的六个面各就其位,他感受到一种成就感。

红军里几乎没有人打游戏,「打手游的时候,如果突然出问题了,特别影响队友」。

在阿里的头两年半,道延做运营商转售业务,但他对技术更感兴趣。每天下班后,他会花一个多小时,看业界前沿的社区和博客。

2016年双11,交易量在零点的第二分钟突然下跌了,大家都没找到是什么原因。事后复盘,道延也被叫了过去,他分析问题出在没给系统做预热,「人跑100米、跑1万米都要热身,系统没有热身、数据没有热身,也会有问题的」。

后来发现果然是这个原因,「从此享受找bug、修bug的感觉」。很快,道延被调做稳定性技术。

红军积累的经验,多数从过往的一次次「失败」中挖掘。经年累月做「消防员」,道延总结出一条最宝贵的应对之道:火灾发生时,第一步绝不是灭火,而是迅速挖出一条「隔离带」,防止火势蔓延,然后连接上提前开辟好的逃生道路,让业务以最快速度逃生。

「头悬剑」

红军一步步锤炼出的防御工具,很多得益于历年双11的教训,甚至是一些「败仗」。

优化和升级贯穿了长达11年的双11技术史,成为一笔无价且强大的「装备」。

2009年,阿里第一次打造双11,当时仅在杭州建了数据中心。到2013年双11,杭州机房已经不够用了。赶上那年杭州很热,近40度的高温几乎持续了一个月,整个夏天都有互联网公司可能被限电的传闻。

「万一机房挂了怎么办?」担忧第一次浮现。

从此,阿里开始尝试「同城双活」,然后是「异地双活」,最后是「异地多活」——在不同城市建立独立的数据中心。

阿里云数据中心

现实中暴露的问题也逼迫阿里加快升级的脚步。2015年,支付宝曾经历过一次事故,谁也没有料到,一场施工竟将光缆挖断了。

这是一段痛心疾首的回忆。100多位技术负责人被拉入一个钉钉群,群名「头悬剑」,彼时的阿里技术保障部负责人刘振飞下了军令状:立刻开启容灾演练和技术架构优化。

2016年1月23日,第一次断电演练在深圳进行。当初的亲历者、阿里云技术专家追源仍能清晰回忆起那个数字——23秒。

流量跌零,他们迅速将流量切至上海,然后静静等待。23秒后,原本奄奄一息的大屏,忽然有根线扬了起来,就像心电图的复苏,在经历一次死亡后复活。

开启定期演练后,各种故障发生的频次大幅减少,但每一次发生后带来的仍是实实在在的阵痛。

每一个阿里新人,都被要求上阿里内部公布客户投诉的平台进行「聆听」,产品宕机后客户的投诉电话最为焦虑。有些是方言,不一定能听懂,但从语气里也能分辨出对方的情绪。

2018年双11,淘宝曾无法修改收货地址。道延在「聆听小站」上听到一个投诉:一个消费者给父母买的家电送到了自己家,无法改地址,他工作又忙,最后白发苍苍的老人只好自己过来,将家电从高楼层搬下,骑自行车运回去。

道延听到后心酸不已,「如果当时我知道这事,我宁愿帮他去搬」。

因为清楚每一次故障背后意味着什么,「争分夺秒」是红军不自言的默契。

但无论经历了再多演练,面对现实中一次潜在的重大失败,身体还是会难以避免的紧张。遇到几次大故障「断路」时,道延特意观察现场同学的状态,有些人手还是抖的,明明想要敲A,却敲成了B。

「演练练的是人的经验,但紧张感是练不出来的。」

日后,他们发现,突袭练到了。

敌人,朋友

在10月24日这次突袭前,阿里已经进行了163次真实的自我攻击,对象或随机,或精准。

6月份,阿里CTO程立曾对一个业务条线发起突袭,结果并不理想,因为新调整的技术产品还未在真实环境下被演练,故障处理流程也不够流畅。突袭暴露问题后,业务团队多次复盘,去别的红军团队取经,在APP上得分越来越高。

在一次次突袭中,红军练出了越来越快的反射弧。以前遇到问题,都是靠人去恢复,现在大部分靠系统自愈,先是连续、快速地检测——有的检测6次,有的高达十几次,以防误杀——一旦确认了,迅速把流量切走。

后来,有次阿里CTO程立再发动突袭,没想到两三分钟就恢复好了。程立问身边同学:这是真实的吗?你们有没有人偷偷泄露?

别说泄露,当突袭发动时,连身为APP研发人的蓝军中亭也不知道是突袭还是真实故障。

「对抗」背后,蓝军和红军逐渐形成更深层的「合作」关系。

红蓝军相会

设计突袭故障场景前,中亭领衔的蓝军先要去走访一轮红军,看他们曾遭遇哪些历史性的重大故障,对下游依赖如何、有没有重大技术改造,和红军达成共识后,再针对性地找出他们的漏洞。

突袭结束后,红军和蓝军面对面坐下来,一起复盘。蓝军指出红军的问题,红军再予以反驳。战斗过程看着刺激,但能从战斗中学到什么才是更重要的。汉英打了个比方:最开始公司的业务是玻璃球,落到地上就碎了;经过月复一月的突袭后,变成了纸球,最起码坏不了了;最终是要变成弹力球,摔到地上还能弹回来。

与蓝军共存久了,红军甚至学起了蓝军,内部自发组织成立了「红军中的蓝军」。

如果将突袭比作大考,云州隶属于要答题的红军。但为了更好地应对大考,他团队中的红军内部还会在每月底定期推出一次小考。这时候,云州就客串出题的蓝军。「我不停地去攻击我团队的人,他们都顶住了,才可能扛住集团的突袭。」云州说。

高强度的突袭切切实实提升了系统的性能和表现。云州记得,不过是三四年前,仅仅是网络产品团队一年的故障分就高达1000多分,而今年迄今为止,故障分是29分。SLA(服务水平协议)中,阿里的电商业务承诺可用性达99.995%,意味着一年中只有26分钟不可用——这个数字已经极低。

明年,目标是再次极限提升,不可用时间降到分钟级。

指标落到了蓝军身上。中亭一开始压力山大,防守是红军的任务,为什么让蓝军去背这个指标?

后来他想明白了:「既然我们要去验收他们,必须跟他们站在一起,去改变。」「就像太极的黑色永远都是不全面的,有了白色就会让它更好。」

生产突袭这场战役,最终的目标,是「让每一个小二都可以参与到共建之中来」。

隐蔽的角落

在阿里内部突袭APP上,最高级别的五星袭击是让支撑核心业务的阿里云数据中心断网。

阿里云如同积木的最底层,抽掉了,整个玩具都塌了。「相当于最基础的水电煤」,阿里云网络团队红军云州形容,千锤百炼阿里云的容灾能力极为重要,因为上百万家外部互联网、政务、金融等领域客户把身家性命放在上面。

每一年双11来临时,除了阿里巴巴灯火通明,阿里分布在全球的数据中心和服务器也在飞速运转。单个数据中心同时运行着数十万个进程,连对空调冷量的需求也比往常增大许多。荧光闪烁的数据中心交织成网络,光点在中国华东、华北、华南聚集,也辐射至各大洲。

数据中心指挥中心

外界曾流传的一个玩笑是:双11零点在数据中心边上「剁手」,网速更快。

十几年前才一两家数据中心时情况或许真是这样,但现在,数据中心已遍布全国,实现了几乎零延时——从北至南,阿里已在22个城市部署了云数据中心,其中包括五大超级数据中心,分布于乌兰察布、张北、南通、河源和杭州。

驻守的运维工程师是无边数字世界的看门人。为了确保这个世界的物理载体绝对安全,他们也开展了日常性的红蓝对抗和突袭。

有时,安排一人偷偷将某根线拔掉或是让空调罢工,两人比赛,看谁能在规定时间内找到根因,解决问题。

这个由人造设备构建的世界原本很脆弱。高温、台风、雷雨等极端天气都可能影响到数据中心。工程师要做的是,穷举所有问题的可能性,定期检查和突袭所有风险点,并为灾害场景提供充足的冗余性。「就跟熊冬天来之前会囤脂肪一样,不是说到了冬天再囤,会提前储备好。」

工程师们有自己的一套「望闻问切」:闻能闻出电线有没有烧焦、柴油有没有泄漏;听就拿着一根螺丝刀,一头对着水泵,一头对着耳朵,听水泵的轴承有没有问题。

驻守杭州数据中心的工程师中,有一半都是处女座。

在双11的高峰期,工程师们将平时巡检的两个小时提升至四个小时。今年,有一款新升级后的机器人陪伴他们,繁忙时可以代替他们巡检,也能自动更换坏掉的硬盘。

数据中心地广人稀,但迎接这一年中最盛大节日的仪式感不会减少。

双11当天,一切万事俱备后,除了穿上红色的战袍,高峰过后买买买,一个传统是一起吃汤圆做宵夜。此外,各个数据中心还有地域特色:河源会吃苹果和芦柑,感恩「平平安安」,张北则吃烤全羊。

特殊的奖励

内部的一次次演练和突袭,最终服务的是数以亿计的外部消费者和客户。

对阿里技术运行指挥中心的玄烨来说,社会的许多大小变化经过层层链条,最终投射到运行指挥中心的大屏上。春晚时淘宝交易量突然掉下来了,说明节目很精彩,吸引了全国观众的注意力。

去年有一次,阿里在东南亚的购物平台Lazada交易量突然下跌50%。他们赶紧发出故障警报,经过几分钟排查,原来是东南亚发生了地震。

此前,有些养猪户用上了物联网,新生小猪的猪圈安装上温度传感器,温度采集功能异常会向运行指挥中心报警,平台会做出自动化决策。时间同样是最紧要的,长时间不做温度控制,小猪们也许会被冻伤。

加入阿里前,玄烨很难想象,一家企业做的工作、开发的产品,竟渗透进国计民生的毛细血管里。

今年2月,受疫情影响,学生们只能使用钉钉等软件线上上课,家里没网的中学生甚至爬上邻居家的屋顶「借网」。扩容需求量极大,「所有预计第二天都被打破」,就像洪水来袭,不停加固堤坝,可每往上盖一层,洪水又变大了。

光是大扩容就发生了三次,整个过程持续了两周。仅广东河源数据中心,就为钉钉连续扩容10万台云服务器。

期间,钉钉创下一个纪录:利用阿里云弹性计算技术,在短短2小时内新增部署了超过1万台云服务器。

小学生开课那天,阿里云技术团队将近六七十人在电脑前盯着,一上课,钉钉的流量一下上去了,但流量的洪水没有冲垮他们日夜建造的堤坝。

过去数年埋头打磨产品的付出,在这一刻得到肯定。

10月24日凌晨,双11前最后一次「面向失败」的突袭,是对阿里云技术团队的另一次验收。

仅仅过了一分多钟,经过运行指挥中心、业务红军等近十个节点处理后,针对阿里云数据库注入的P1级故障被修复。

如此快的速度,并非靠人,而是靠系统「自愈」。过去多次注入的破坏性攻击,就像疫苗,不断增强了系统的「免疫能力」。

这个晚上,还有另一层特殊意义:10月24日是程序员节。

在这天到来之前,范禹在光明顶讲了一个故事:社会上有35岁程序员「竞争力下降」的焦虑,有同学问张勇,我过了35岁,还能不能专心写代码?

张勇回答,「对于35岁以后立志写代码的同学,我120%鼓励、支持、欣赏、敬佩,为你们创造条件。」阿里传奇工程师多隆从未做过管理,靠着在一线写代码,他成为了合伙人。

范禹与同事一起复盘

事实上,在幕后为阿里巴巴抵御「失败」的红军们,平均年龄也超过35岁。他们是阿里巴巴最难得的「尖兵」,成员几乎只从内部各业务线的骨干中选拔。

「我想趁着这样的一个机会,倡导更多的同学能够关注我们的代码,能够关注我们一线的工程师。」范禹站在交易大盘前说。

10月24日零点过去一个小时,1024个鸡腿摆在了光明顶门口。许多程序员对着拍照留念框,比起了V,这是对未来的期许,寄予即将到来的双11:万事俱备,胜利终将抵达。