第十章 · 胃¶
星期二早上,记事本最后一行还是昨天写的那句——"查 binlog,确认操作人 IP"。索引是谁删的,到现在没有人认。
他打开数据库,查了 binlog 里 2026-08-01 23:14 前后五分钟的记录。
操作类型:DROP INDEX 操作人:root@localhost 操作 IP:10.14.1.88 目标表:settle_reconciliation
他打开工单系统,查了一下 10.14.1.88 的设备归属。页面上显示:营销技术部·测试环境服务器·IP 归属组内 DHCP 池。
他关掉页面,在记事本里加了一行:"10.14.1.88 归属营销技术部测试环境 DHCP 池,无固定分配记录。"
DHCP 池的租约默认保留七天。今天是八月四号,距离八月一号三天。还有四天。
上午十点,值班手机响了。
"数据组,易文。那个表的事你查了没有。"
"查了。索引被人删的。root@localhost,IP 是营销技术部测试环境的 DHCP 池。"
电话那头安静了两秒。
"测试环境的人用 root 连生产库?"
"嗯。"
"你打算怎么办。"
"等。"
"等什么。"
"等那个人再动一次。"
电话那头沉默了一会儿。
"你胆子不小。挂了。"
下午两点,王磊走过来,拿着笔记本电脑。
"陈哥,状态机的转换超时时间,可以配在环境变量里吗?"
"可以。key 是 settle.state.transition.timeout.ms,单位毫秒,默认值 3600000。"
王磊点了点头,回到工位。
下午三点,纪衡的邮件到了。标题"拦截器全量报告,周五前提交"。正文一行:数据范围包括全量当天、全量离线、七天内曲线对比。
陈稳打开记事本记了一行,然后写了一封邮件给易文,问她有没有拦截器全量数据的查询语句。五分钟之后,易文回复了,正文只有一行 SQL:
SELECT
date_trunc('day', access_time) as day,
count(*) as total_requests,
count(CASE WHEN pass = true THEN 1 END) as passed,
count(CASE WHEN pass = false THEN 1 END) as blocked,
count(CASE WHEN alarm = true THEN 1 END) as alarmed
FROM settle_guard_log
WHERE access_time >= now() - interval '7 days'
GROUP BY 1
ORDER BY 1;
陈稳复制了 SQL,执行了一遍。七行,每天都有数:日均请求两万一千出头,拦截量从周一的四十三降到周日的十一,告警零。
下午五点四十,右上腹开始疼。位置在肋骨下沿往里两指,不是绞痛,是压着的那种,饭后一小时左右开始,持续一个到两个小时。这是七月中旬开始的,最早那次是七月十六号加班到十一点,他记在记事本上,写的是"胃",一个字。
晚上七点,公司楼下路边的药店。铝碳酸镁片,三十六粒装,二十八块。店员问要不要开个发票,他说不要。
地铁上人很多,他站着,包里的药盒贴着大腿,硬的,硌得慌。
家里的抽屉里,之前那盒还剩十粒,新的一盒摞在上面。抽屉里还有一盒没开封的挂耳咖啡,去年团建发的,包装上写着"乍暖还寒·手冲·中度烘焙",保质期到今年十月。他关上抽屉。
星期四上午,值班手机响了。运维组的人说营销结算适配器的限流配置被覆盖了,当前是关闭状态。陈稳打开配置文件,看到限流开关又被改回了 false,注释掉了,跟他周一改之前一模一样。他打开 Git 日志,发现昨天下午有人提交了一个 commit,把配置文件回滚了。commit message 写的是"revert: 恢复默认配置,营销活动结算已结束。"
他打开 Git blame,看到作者是 [email protected]——张毅。
他给运维组回了电话,说限流配置被人回滚了,让他们重新打开。他挂断电话,打开记事本,加了一行:"2026-08-05 营销结算适配器限流配置被回滚,回滚人 zhang.yi,已重新开启。"
星期五下午,他提交了拦截器全量报告。一千二百字,四个部分:全量数据、拦截效果分析、误拦截率、下阶段计划。纪衡没有回复。
第二周。
拦截器全量报告没有回复。陈稳每天刷新一次邮箱,纪衡的收件箱里没有新邮件。星期三,纪衡在全员会上说了一下拦截器的数据,说"效果不错",然后提到"陈稳的拦截器"。陈稳正在盯着会议室的桌子,桌子上有一道划痕,三厘米长,从中间往右。
"陈稳。"
陈稳抬起头。
"拦截器全量之后的维护计划,你下周出一个方案。"
"好。"
纪衡继续讲下一个议题。陈稳低下头,继续盯着桌子上那道划痕。
第三周。
陈稳写了拦截器维护方案,八百字,五个部分:监控告警、配置管理、灰度发布、版本迭代、应急响应。他写完了,发给纪衡,纪衡回了三个字:"可以。按这个执行。"
他关掉邮箱,打开 IDE,继续写代码。
他每天早上在地铁口的便利店买一瓶水,冰的,放在桌上,等它变成常温再喝。他喝了一半,胃就不舒服了,剩下的半瓶放着,第二天早上倒掉,换新的。
药盒里的药在减少。第一盒三十六粒,吃了两周,剩了十二粒。他又买了一盒,一盒三十六粒。抽屉里两盒,一盒十二粒,一盒三十六粒,加起来四十八粒。他每天吃两粒,早餐后一粒,晚餐后一粒,偶尔下午胃疼,多一粒。
星期四晚上,他在地铁上收到何晚的微信。
"你最近是不是很忙。"
"还行。"
"你这周回来都是十一点以后。"
"值班。"
"你不是上周就值班吗。"
"这周也值。"
"你上次说带我去看那个展,还有两周就结束了。"
"周六去。"
"那周六?"
"好。"
星期六,他起了床,换好衣服,穿何晚买的那双皮鞋,四百八,鞋尖起皱。他们约在展览入口见。陈稳坐地铁过去,四十分钟,站了三十五分钟,坐了两站。他到的时候,何晚站在门口,穿了一件白色棉布裙子,头发扎起来,手里拿了一杯奶茶,吸管已经咬扁了。
"你来晚了。"
"地铁慢了。"
"你每次都这么说。"
"这次是真的。"
何晚看了他一眼,没有继续说,转过身,往展览入口走。陈稳跟在后面,刷卡,进场。
展览是摄影展,一个摄影师在世界各地拍的照片,挂在白色墙上,每张下面有一行小字,写着拍摄地点和时间。陈稳很慢,看一张,往前两步,看下一张。何晚快一些,有时候停下来等他,等到了,又往前了。
中间那张照片前,何晚停住。照片上是一座城市,从高处拍的,整座城市浸泡在雾里,只有几栋高楼的顶端露出来,像是浮在云上。
"这张好看。"
"嗯。"
"你知道这是哪里吗?"
"不知道。"
"我也是。"
出口那边,何晚的奶茶喝完了,她把杯子拿在手里,四周没有垃圾桶。陈稳说前面有一个,他把杯子拿过去扔了。
"你最近瘦了。"
"没瘦。"
"你脸上没肉了。"
"天气热,吃不下。"
"你胃又疼了?"
"没有。"
何晚看着他。上一次她问这句话是四月,那次他说的也是"没有"。四月那次是真的没有。
面馆,一人一碗面。陈稳吃了一半,右上腹又压上来了,他把筷子放下,喝了一口水。何晚把他碗里的面夹了一些到自己碗里,没有出声。
"你上次看医生是什么时候。"
"去年。"
"吃胃药不能当吃饭。"
"没有。"
"我上次在你抽屉里看到三盒药。"
抽屉里是两盒。一盒剩十二粒,一盒三十六粒。她看到的第三盒是挂耳咖啡,纸盒,跟药盒一样大。
"你是不是没告诉我。"
"告诉你什么。"
"你胃不好。"
"你看到了。"
"你胃不好多久了。"
"入职以后。"
"你入职多久了?"
"十一个月。"
何晚放下筷子,看着陈稳,没有表情。
"你那个公司是不是有毒。"
"还行。"
"还行是什么意思。"
"就是还行。"
"你每天都在加班,值班,处理线上事故,你跟我说还行。"
"是还行。"
"你现在胃疼,面都吃不完,你说还行。"
"吃完了。"
"你吃了一半。"
"够。"
"你够什么够。"
这个月他吃了四十二粒,比上个月多十四粒。这个数他没有算过,但他知道两盒之间隔了多少天。
何晚看着他,等了一会儿,说:"你是不是觉得,跟我说这些,没有用。"
陈稳说:"不是。"
"那是什么。"
"我不知道怎么说。"
"你跟我说,你胃疼。就这么难。"
"不疼。"
"你刚才把筷子放下了。"
"饱了。"
何晚没有再问。她去收银台结了账,两碗面四十六块,陈稳掏手机的时候她已经付完了。
外面天已经黑了,路灯亮着,街上的人不多,偶尔有一辆电动车从旁边驶过,车灯把影子拉长,然后消失。
"我回去了。"
"好。"
"你周六不要加班。"
"没加。"
"你上次周六也跑了。"
"那是告警。"
"你那个手机是不是从来不关。"
"不关。"
"你晚上睡觉也不关。"
"不关。"
"你怕什么。"
"怕出事。"
"出事有你吗。"
"有。"
"那你就得一直开着?"
"嗯。"
何晚站在路灯下面,灯光照在她脸上,没有表情。她站了一会儿,然后说:"我走了。"
"好。"
她转过身,往地铁站的方向走,走了一段,没有回头。陈稳站在路灯下面,看着她走远,直到她的背影消失在拐角处。他站了一会儿,然后转过身,往反方向的地铁站走。
第四周。
陈稳去医院做了一次胃镜。报告上写的是慢性非萎缩性胃炎,胃窦部黏膜充血,幽门螺杆菌阴性。医生问他一天吃几顿,他说两顿,有时候一顿。医生说规律饮食,少吃刺激性食物,开了药,一个月的量,让他一个月后复查。
复查那天是九月四号,星期五。他没有记进记事本。
他回到工位,把药放进抽屉里,跟那两盒胃药放在一起。抽屉里现在有三盒胃药,一盒剩十二粒,一盒剩十四粒,一盒新开的,医生开的,药片比较大,锡箔纸包装,一粒一粒压出来的,按下去的时候会发出清脆的响声。
何晚没有再发消息。
陈稳每天早上在地铁口买一瓶水,冰的,到公司放在桌上,等它变成常温。他喝一半,剩下的一半放着,第二天早上倒掉,换新的。他每天吃两次药,早餐后一次,晚餐后一次,偶尔下午胃疼,加一次。
他写完了 DDL 审批流程改进方案,发给纪衡,纪衡回了三个字:"改一下。" 他改了一版,又发,纪衡回了两个字:"可以。"
他每天查一次监控,结算成功率百分之九十九点九九,拦截器正常,连接池使用率百分之六十八到百分之七十二,波动不大。
他每天看一次对面那扇窗,黑的。
八月第三周,纪衡发了一封邮件,标题是"双月会通知"。时间:八月二十八日上午十点,地点:三楼会议室,每人十五分钟,汇报顺序:陈稳、蒋辉、资深工程师、纪衡总结。
陈稳看到邮件的时候,正在数据库客户端里查拦截器数据。汇报顺序里他在第一个,蒋辉在第二个。上一次也是这个顺序。他关掉邮件,继续查数据。
他查完数据,打开记事本,翻了一下,从第一行往下翻:营销结算适配器限流开启,限流被回滚,DDL 审批流程改进方案,拦截器全量报告,拦截器维护方案,双月会通知,对面楼的窗还是黑的,胃药吃了三盒,何晚没有再联系,那个 IP 没有查出来是谁的。
他翻完了,关掉记事本。茶水间的水是热的,喝下去胃没有反应。窗外对面那栋楼,窗户亮着,三楼,五楼,七楼,八楼,九楼。他看了十一个月的那扇窗,还是黑的。
回到工位,他在代码里加了一个注释:
他写了十五行代码,实现了一个简单的配置版本对比方法,把当前配置文件的哈希值和最近一次 Git 提交的哈希值做对比,不一样就写日志,告警。他跑了一遍单元测试,全部通过,提交。
commit message 写的是:
feat: 限流配置变更检测——对比配置文件哈希值与 Git 提交哈希值,不一致时告警
营销结算适配器限流配置在一周内被手动回滚两次,生产环境的配置变更
缺乏追踪。该检测逻辑在适配器启动时运行,若配置文件与 Git 最新提交
不一致,写入 WARN 日志并触发告警。
后续可扩展为配置变更监控面板。
他提交了,关掉 IDE,收拾东西。地铁上靠窗有位置,窗外是黑色的,偶尔有光照进来,是站台上的灯。
到家快十一点。厨房里那杯水是凉的,喝了一口,胃缩了一下,他把杯子放下,没有继续喝。卧室里,他躺下来,闭上眼睛,面朝墙壁。墙上的光从窗帘缝隙里漏进来,在天花板上拉出一条细长的白色线条。
他盯着那道线条,看了一会儿,然后闭上眼睛。
他想起何晚说的话——"你是不是觉得,跟我说这些,没有用。"
他翻了翻身,面朝天花板,看着天花板,没有动。
"我不知道怎么说。"他说。
房间里没有第二个人,没有人回答他。
他躺了一会儿,然后坐起来,看了一眼时间,十一点十三分,还早。他打开手机,打开监控大盘,绿的,平的,结算成功率百分之九十九点九九,拦截器正常,连接池使用率百分之六十九。
他关掉手机,把手机放在床头柜上,躺下来,闭上眼睛。
他想起那条被删除的索引,那个没有被查出来的 IP,那句没有说出口的话。
他想起顾源说的——"有人改过那个表的结构。"
他翻了翻身,面朝墙壁,天花板上的光还在,细长的,从窗帘缝隙里漏进来,像是某条用过的线,拉直了,扔在那里,没有人收。
他闭上眼睛,没有睡着。
过了很久,他坐起来,打开手机,看了一眼时间,凌晨零点零三分。他打开记事本,写了两行字:
"明天查一下 10.14.1.88 的 DHCP 分配记录,看能不能找到那个时间点谁在用。"
"买药。铝碳酸镁片,还剩十二粒。"
他写完,关掉手机,把手机放在床头柜上,躺下来,面朝墙壁,闭上眼睛。
他听到自己的心跳,跳得很慢,一下,两下,三下,然后他睡着了。
← 第九章 值班 · 目录 · 第十一章 第一次汇报 →