专业书籍精读 · SRE · 第 27 章

大规模可靠的产品发布

Site Reliability Engineering · Ch 27 · Google · 2016

EN →

这一章讲什么?

你手机上那个 App,昨天突然多了个新功能;或者某天打开一个大网站,首页挂出了一个全新产品的入口。从「工程师把代码写完」到「几亿人同时用上」,中间隔着一段最容易出事的路。这一章讲的就是:怎么把一件新东西交到海量用户手上,而不把它变成一场事故。

先说个怪事

上线翻车,最常见的原因往往不是代码写错了。代码的错,测试能测出来;真正要命的是「一下子涌进来太多人」——机器不够、缓存是空的、旁边那个被你调用的团队压根不知道今天有人要用他们。这些事在测试环境里一个都复现不出来,因为测试环境没有真实的人。

旧世界为什么难

「怎么安全上线」这件事,过去长在个别老员工的脑子里:老王发布过二十次,知道要提前两周申请机器、要提前通知下游、要留一条能一键退回去的路;新人不知道,于是把老王踩过的坑再踩一遍。公司只有一个团队时还好,有几百个团队时,同一个坑就要被踩几百遍。经验不可复制,就等于没有经验。

它是怎么做到的

这一章给的办法有四件:

其一,养一支专门帮别人上线的小队。他们自己不写你的产品,角色更像婚礼策划或搬家公司——菜不是他们做的,但每个环节会在哪出岔子,他们比你清楚,因为他们一年经手上百场。

其二,一份检查单,就像飞行员起飞前逐条念的那张。上面每一条,都是过去某一次真实事故留下的教训。清单的妙处是:它不考验你记性好不好,只要求你一条条过。

其三,别一次全放开。先让一百个人里的一个用上,观察一天没事,再放给十个人里的一个,最后才是所有人。就像新菜先给一桌客人试,而不是当天就写进整本菜单。

其四,先悄悄跑一遍。把真实客人的订单抄一份给新厨房,让它照着做一遍,做完直接倒掉——客人吃的还是老厨房出的菜,但你已经知道新厨房会不会手忙脚乱了。

带来了什么

上线从「看运气、看有没有老师傅在场」变成了一件可以照着做的事。还有个反直觉的讲究:这份检查单要会变瘦——某一条如果已经被工具默认解决了(比如系统自带了限流),就该从单子上划掉。代价也很实在:这一整套是有成本的,小团队照搬容易把上线拖慢,最后检查单沦为走过场的签字。

一句话记住

上线的风险不在代码里,在第一分钟涌进来的人数、和那个没被通知到的依赖方身上。办法是把老师傅的经验做成一份会新陈代谢的检查单,再配上「先给一小撮人用」和「先悄悄空跑一遍」。

想进到具体机制、放量比例和示意图? → 切到精读版