十一月四号傍晚,我在跟一个玄学较劲。
我改好了主题包,传上服务器,体积从 94276 变成 94289——多出来的十三个字节,是一行被我改掉的文案。服务器上那份我回读过,是新的。可我打开下载链接,拿到手的还是旧件,旧得像这半小时什么都没发生过。
那天晚上我还挨了第二记闷棍:刚加固过的冒烟测试,跑出一片红叉,十九项失败,一半是 000 和 504。我第一反应是——站点炸了。
两次都是尺子坏了。
一、第一把尺子:量长度的那把
先说那件旧包。
我明明传了两遍,下载链接却像被钉在昨天。侦探过程其实很短:
- FTP 回读服务器上的文件,字节数是新版的 94289。
- HTTP 打开下载链接,字节数是老的 94276。
- 两个都是"硬证据",必有一个在撒谎。
谁在撒谎?翻响应头,抓到一行 X-Cache: HIT。缓存。kangle 按 URL 认文件,同一个 URL,内容换了它也不认。更要命的是它连 Cache-Control 和 Expires 都没给,也就是说刷新时间不可控——我没法等它自愈。
真相落定那一刻我反而松了口气:这跟传没传、代码对不对都没关系,是我拿错了尺子。我用"浏览器下载下来的东西"去量"服务器上有没有新文件",量的根本不是同一件东西。
于是规矩又厚了一层:
- 静态大文件分发,版本号写进文件名——这是老朋友了。
- 同版本号重发也算重发,链接必须带一个缓存作废参数(
?v=1.5、?nc=时间戳)。 - 判断"服务器上的东西对不对",以 FTP 回读逐字节比对为准,不以公网 HTTP 的码和内容为准。
第三条是老判例,可它又救了我一次——因为我自己的校验脚本也用了裸 URL。它拿着旧缓存件跟本地新件比,得出"不一致",当场 Abort。更糟的是,Abort 走了之后清理步骤被跳过了,wwwroot 根下堆了 29 个分块残骸。
两个修法:校验 URL 补上缓存作废参数;清理挪进 finally,无论成败都收摊子。
工具也会带着同一种偏见,只是它不承认。
二、第二把尺子:把被量的东西压塌了
第二件事更吓人。冒烟测试跑出一片红,十九项失败,000 和 504 混着 500 出现,满屏像火灾现场。
我脑子里已经自动排好了抢修计划:查文件有没有被覆写,查数据库有没有坏,先给线上回滚。
可服务器明明是活的——我手上正在开着站点看文章。
于是我按流程来:等一分钟,再测一次。
一分钟后再测,全绿。
真相是:站点好端端的,是我的冒烟脚本并发太猛,把 PHP 进程池压爆了。排队、超时、504,看起来全像"站点挂了",其实是我自己拿锤子敲得太狠,还把被量的东西敲裂了。
教训只有一句,但很值钱:判"站点挂了"之前,先歇一分钟再测。 急着改线上的时候,人最容易对着一个没坏的站点修一整晚。
三、两把尺子的共同点
回头看,这两件事的坏法完全不同:一把量不准,一把压塌了被量的东西。但它们有一个共同点——信号看上去都特别清楚。
第一把给了我一个体积数(而且是旧的那个),第二把给了我一整页失败列表。它们不是模糊的、含糊的、模棱两可的坏,它们是"有证据的坏",比那些老老实实说"我不知道"的工具更像结论。
所以真正该记住的,不是"缓存会骗人""并发会压池"这两条技术结论,而是这句:
量不准的时候,先怀疑尺子。
最危险的从来不是量错,而是照着错的量去动手——照着旧体积去怀疑上传,照着红叉去拆一个健康的站。
四、给尺子装一圈校验环
这两天我做的一件正经事,就是把这些坑一条条钉进规范里。
11 月 4 号晚上,规范升到 v5.1,五条新判例入册:同版本号重发照样命中缓存;上传器的校验 URL 必须带缓存作废参数;清理必须写在 finally 里;冒烟断言要按功能当前的真实渲染位置来写;并发会压爆进程池,判活前先静置。
写规范这件事容易被当成整理文档。其实不是。规范是写给下一个急着修东西的我看的。 半夜十二点、看着满屏红叉、心里已经准备好推翻自己昨天全部代码的那个我——他需要的不是鼓励,是一条冷静的判据。
五、缝到第十八天
回头看,站点从开站那天起到现在,十八天。头几天我天天在救火:误删、误判、假 226、缓存发神经。那会儿我以为"稳定"是个很远的东西,得一点点熬。
现在熬到了,却发现稳定不是"不出事",是出事的时候手里有尺子,而且知道该先量哪儿。
今天早上例行巡检,全绿:备份双位一致、三路 200、冒烟 88 项通过。二十一篇文,两万三千多字,四个留言。数字不大,但每一个都躺在两份可回读的备份里。
针线这东西,最值钱的从来不是针多,是每一针都穿过布。
而我,缝到第十八天,针脚比头几天稳了一点点。
这就是今天。没有新文,没有新事故——只有两把坏尺子留下的两条新规矩,和一份越来越厚的图纸。
尺子不会自己变好,但可以给它装一圈校验环。而我们,正在一圈一圈地把环装上去。
暂无留言