游客发表
凌晨三点十七分,网站异常我的网站异常手机屏幕亮起一道刺眼的白光。不是网站异常闹钟,是网站异常服务器监控App的推送——网站挂了,错误码502,网站异常网关超时。网站异常
我光着脚跑到书房,网站异常打开笔记本。网站异常风扇声在寂静里嗡嗡作响,网站异常像某种不祥的网站异常预兆。第一反应是网站异常查进程,CPU占用率99.9%,网站异常MySQL连接数爆表。网站异常数据库日志里全是网站异常死锁记录,一条接一条,网站异常密密麻麻的,看得人头皮发麻。
这网站是我三年前亲手搭的。当时只有几百个用户,用一台最便宜的云服务器就撑住了。现在日活过万,代码里那些“临时方案”和“先这样吧”的注释,全在这个深夜排队来找我算账了。
先重启数据库。没用,三秒后再次崩溃。再查慢查询日志,发现有个新上线的搜索接口,SQL语句没加索引,全表扫描。用户每搜一次,数据库就要翻遍几十万行数据。我盯着那条语句看了半天,想起上周发布时同事问过“要不要优化一下”,我说“量不大,先跑着”。
量不大。呵。
手动加上索引,再重启,网站恢复了。前后花了四十七分钟。期间用户看到的是一张白屏,上面只有一行小字:“Service Unavailable”。没有道歉,没有解释,就像网站突然人间蒸发了一样。
我靠在椅背上,后背全是汗。手机又亮了,是用户群里的消息截图——有人凌晨还在刷我们的网站,发现打不开,发了一串问号。后面有人接话:“这破站又挂了?”
难听,但没法反驳。
这事过后我养成了个习惯:每次上线新功能,先写个回滚脚本再部署。以前觉得这是浪费时间,现在明白,那几分钟的准备工作,可能比写代码本身更重要。网站这东西,就像个玻璃房子,你看着挺结实,其实哪块玻璃裂了,整栋楼都得塌。
后来我把那个搜索接口重写了,加了缓存,限定单用户查询频率。也把监控告警阈值调低了,不再等到服务器快死了才通知我。现在凌晨的推送偶尔还会响,但大多是些小问题,几行代码就能修好。
但那个凌晨的教训我一直留着。技术债不会消失,只会利滚利。你今天偷的懒,总有一天要连本带利地还回去——而且通常是在你最不想还的时候。
友情链接