凌晨一点十七分,陈峰的手机还在响。不是电话,也不是消息,是后台系统第七次报警。他看着笔记本上的数据,心里明白——APP崩了。
用户数从三万涨到十万,又在十二点四十三分直接掉到零。
他没说话,也没发火。合上电脑,穿上那件旧卫衣,拿上伞和螺丝刀,下楼去了便利店。他习惯在这时候吃关东煮,边吃边想问题。店员小哥给他多放了一根萝卜,说:“程序员辛苦了。”他点点头,在门口的小凳子上坐下,一边喝汤一边翻手机里的日志。
错误信息显示数据库连不上,请求堆了八万多条。这是流量太大导致的。他以前做过外包项目,见过类似情况。但那时候有团队一起扛,现在不一样。这个APP是他自己注册的公司做的,服务器的钱也是从他银行卡扣的。
他咬了一口鱼丸,突然想起吴颖去年双十一发的朋友圈。那天她拍了一张仓库照片,地上全是贴了城市标签的快递箱,配文说:“订单太多,不缓一缓,仓库要炸。”
当时他还笑她:“你这不是卖饰品,是搞物流。”现在想想,她的做法其实很聪明。预售分流,按地区存一部分货,减轻压力。
他停下筷子。
如果把用户也按城市分开呢?用一个简单的网关把请求分到不同的地方处理,不就能减轻主服务器负担了吗?再学她那样,把常用的数据先存到内存里,比如推荐房源、匹配结果这些,别人访问时就不用每次都查数据库。
想到这儿,他一口吃完剩下的关东煮,拿着空杯回了出租屋。
两点钟,键盘声又响起来。他在本地搭了个测试环境,用Nginx做了三个入口,分别对应一线城市、二线城市和其他地区。每个入口独立工作,互不影响。然后加了Redis缓存,把用户信息、热门房源、评分这些常看的内容放进去,每五分钟更新一次。
做完这些,他看了眼账户余额。太贵的服务买不起,只能靠现有的两台服务器撑着。他在其中一台上建了两个Docker容器,假装是额外的服务器,再设置心跳检测,万一哪台坏了能自动切换。虽然办法土,但能用。
三点五十六分,第一次测试开始。他用脚本模拟五万人同时访问,系统撑了不到一分钟,最后卡在图片加载上。
他皱眉,检查代码,发现问题出在图片存储。所有照片都在主服务器上,人一多就堵死了。他干脆把图片全都搬到CDN上去,免费额度够用一周。
四点三十六分,第二次测试开始。这次十万人同时访问,系统稳住了。首页打开速度比之前还快了0.8秒。他松了口气,把新架构截图发到开发群,写了一句:“别慌,我在修。”
然后重启线上服务。
等系统上线的时候,他泡了一碗红烧牛肉面,坐在床边吃,眼睛一直盯着监控页面。人数慢慢回升,三千、八千、两万七……到早上六点,稳定在九万八左右,没再掉下来。
他靠在墙上闭眼休息。窗外传来公交碾过水坑的声音。楼下早餐摊炸油条的香味飘进来。他拿出手机,在备忘录里写下:“服务器扛住了。下次得早点加监控。”想了想,又补了一句:“吴颖那套分拣方法,真挺厉害。”
七点十分,应用商店的评论变了。昨天半夜那些“退钱”“垃圾软件”的差评下面,有人留言:“刚打开,居然好了?”“我以为要等几天,结果一夜就修好了。”还有一个叫“合租小透明”的用户说:“昨晚匹配成功的室友今天来签合同了,这功能救我命了。”
陈峰看到这条,嘴角动了一下,没笑出来。
他打开后台数据。故障前七天留存率是51%,崩溃后跌到37%。现在二十四小时内有64%的用户回来了,第二天留存升到76%,预测一周留存接近60%——创了新高。
不只是老用户回来,很多人还愿意继续用。
他把报表截图保存,准备白天发给产品负责人。然后退出系统,关掉窗口,只留一个服务器状态页在桌面右下角。绿色的小点亮着,说明一切正常。
他倒扣手机,脱掉外套躺上床。床垫是二手买的,翻身会吱呀响。窗帘没拉紧,一道光斜照进来,落在他右耳的小痣上。
快睡着时,他脑子里冒出一个念头:等创业补贴到账,一定要换个好点的显示器,现在的边框太宽,看着累。
窗外,城市醒了。洒水车慢慢开过街口,喇叭里放着老歌。他的呼吸变平缓,左手垂在床边,指尖离充电线只有两厘米。
笔记本屏幕还亮着。监控页面显示在线人数:98,742。延迟47毫秒,错误率0.03%。一条新通知弹出来,是运维脚本发的巡检报告,标题写着:“服务运行正常。”
风扇轻轻转着,屋里安静了下来。