跳转至

第七章 · 蒋辉的方案

周四早上八点十二分,邮箱里有一封新邮件。发件人纪衡,抄送结算组全员,标题是“双月会通知:下周三下午两点,三楼会议室”。

正文两行:时间七月二十八号周三下午两点,每人十五分钟,请提前准备。

陈稳把昨晚改好的 PPT 过了一遍。四条内容,数字对齐,时间标注清楚:拦截器灰度、规则引擎接入、价值量化、下阶段排期。四条里有三条是七月做完的,第四条价值量化,纪衡批了三版才过。

十五分钟一个人。结算组算上他有五个人要报,两点开始,四点前结束,他排在第一个。他把第四条往后挪了一页。

中午,食堂靠窗的位置,易文对面空着。

“这里有人吗。”

“没有。”

陈稳把餐盘放下,拿起筷子。

“双月会通知看到了?”易文说。

“看到了。”

“你准备讲什么。”

“模板那四条。结算运行,拦截器,规则引擎,价值量化。”

易文拿起勺子,喝了一口汤,说:“蒋辉要报什么。”

“他说是智能重试补偿方案。”

“什么东西。”

“不知道。他没说细节。”

易文夹了一根青菜,吃了,慢慢嚼完,然后说:“你那个拦截器,灰度跑了多久了。”

“三天。全部通过。”

“数据够不够。”

“够。一千八百多条。”

“周三讲的时候,把这个数据放在开头,不要放在中间。”

陈稳说:“好。”

易文吃完饭,把餐盘端起来,说:“你那个 PPT 我帮你看看?”

陈稳愣了一下,说:“行。”

“吃完饭发我。”

“好。”

易文走了。陈稳把剩下的饭吃完。

下午一点半,他提交了调度通知的异常处理,两个 catch 分支,一个走重试,一个落库。单测全绿。切回邮箱,易文的回复已经在里面。

“标题太大了。你这不是汇报,是填表。”

陈稳回了一个“好”。他打开 PPT,把标题改成“结算系统七月改进报告”,发给易文,易文回了一个“可以”。

下午,他收到一条消息,是蒋辉的私聊。

“陈稳,你那个拦截器,灰度数据能不能给我看一下?”

陈稳看了这条消息,没有立刻回复。他想了想,打了几个字:“你要做什么。”

“我那个方案需要参考一下实时拦截的数据,不涉及你的代码。”

拦截器灰度跑到第三天,日志表里 1,843 条,通过 1,843 条,告警零条。这组数字周三要放在他 PPT 的第一页。给出去,蒋辉的 PPT 上也会有这组数字。

陈稳拿起手机,回了一个字。

“好。”

他把日志文件的路径发给了蒋辉。

蒋辉回了一个“谢了”,后面跟着一个竖大拇指的表情。

陈稳放下手机,关掉 IDE,下班。

周五早上的电梯里站着蒋辉,手里一个透明封面的文件夹,夹着几页打印纸,有表格,有箭头。

“早。”蒋辉说。

“早。”

“你那个灰度数据挺好用的。”蒋辉说。

“嗯。”

“我那个方案,准备用拦截器数据做对比。”

settle_guard_log 只有 pass 和 alarm 两个布尔字段,没有记失败原因,也没有记补偿耗时。蒋辉做的是补偿方案,用这张表做对比,只能算出拦截了多少笔,算不出补偿快了多少分钟。陈稳没有问他打算怎么算。

八楼走廊里蒋辉走在前面,步伐比平时快,衬衫下摆塞在裤子里,腰上的皮带扣反射了一下灯光。

他写了一个小时,收到一条消息,是易文发的。

“你的 PPT,我帮你改了一版,你看看。”

附件里是一个文件。陈稳点开文件,页面布局没变,标题变了。易文把他的第一条改成了“灰度拦截器上线 72 小时,累计拦截 1,843 次,通过率 100%,0 资损”,在下面加了一行字:“对比:历史同期凌晨时段事故率——2024 年 4 次,2025 年 2 次,2026 年 1 次(截至 7 月)。”

他看了一遍,又看了一遍,然后回了一条:“这个对比数据在哪里查的。”

易文回得很快:“事故记录。你自己写的复盘里就有。”

陈稳看着这条回复,没有打字。他关掉 PPT,打开自己的原版,打开事故记录,找到了那组数据——去年四次,前年两次,今年一次。他复制了这组数据,贴到自己的 PPT 里,放在第一条的下面。

他保存,关掉,给易文回了一个“好”。

下午,他打开微信,看到群里有人问蒋辉:“你那个方案,重试补偿的逻辑,跟陈稳上周做的 settle.guard 有什么区别?”

陈稳看着这条消息,手指停在屏幕上。

过了一分钟,蒋辉回了。

“底层逻辑不一样。他那个是事务拦截,我这个是事后补偿。一个是防护,一个是修复。可以互补。”

陈稳又看了一遍,放下手机,打开 IDE,继续写代码。

周一,他到公司,打开电脑,看到邮箱里有一封新邮件,发件人是纪衡,时间是早上七点五十分,收件人是蒋辉,抄送结算组全员。

邮件正文只有一行字:“方案有亮点。周三讲的时候,重点讲‘可复用’的部分,不要只讲故障场景。”

他看了两遍,关掉。

下午的时候,他收到一条消息,是易文发的。

“周三的汇报你讲了吗。”

“还没。周三下午。”

“准备得怎么样了。”

“还行。”

“你有彩排过吗。”

陈稳看着这条消息,没有立刻回复。他想了想,打了几个字:“没有。”

“那你现在讲一遍给我听。”

走廊尽头那间小会议室门开着,里面没有人。陈稳进去关上门,打了语音电话给易文。

电话接通了。

“你开始了。”易文说。

陈稳打开 PPT,看着屏幕上的第一条内容,清了清嗓子,说:“结算系统七月改进报告,主要工作包括拦截器灰度发布、规则引擎接入、价值量化提交。”

他说完,停了一下,等易文说话。

“你讲完了?你刚才说的跟你 PPT 上写的一模一样。你是在念,还是在讲。”

他确实是在念。这稿他念过三遍,前两遍在家里,第三遍是刚才。

“你重新来。不要念,你把 PPT 合上,跟我说这个月你做了什么。”

陈稳把手机放在桌上,开了免提,然后把 PPT 最小化,看着空白的屏幕,想了想,说:“这个月做了三件事。第一,拦截器上线灰度,跑了三天,全部通过,没有资损。第二,规则引擎的调度通知接入了,加了重试机制。第三,价值量化写了三版,最后通过了。”

“谁通过的。”

“纪衡。”

“他为什么通过。”

“因为方向对了。”

“什么方向。”

陈稳想了一下,说:“降低资损和人力成本。”

“那你怎么不把这个放在开头。”

汇报模板的第一栏是“本月工作内容”,第四栏才是“价值与收益”。他填的时候是按栏填的。

“你重新来。从‘最后通过了’开始讲。”

陈稳沉默了一会儿,然后说:“纪衡批了三版价值量化,最后通过的方向是降低资损与人力成本,不是技术指标。”

“然后呢。”

“拦截器灰度数据 1,843 次请求,全部通过,零资损。对比历史同期,该拦截器可覆盖历史七次事故中的六次。对比数据来自事故记录,由易文提供。”

“好。继续。”

陈稳把三条内容讲完,讲到最后一条的时候,语速稍微快了一点,他自己感觉到了,压了一下,把最后一句说完。

电话那头安静了两秒。

“好多了。但周三讲的时候,你就记住一个东西——纪衡想问什么。”

“他问什么。”

“他问的是‘影响多少钱’。你所有内容,都要回到这个点上。”

陈稳说:“好。”

“再练两遍。”

“好。”

电话挂断了。陈稳坐在会议室里,面前是空白的屏幕,墙上的时钟显示下午三点四十一分,秒针在走,一格一格。

回到工位,他打开 PPT,把第一页的标题改成“结算系统七月改进:减少资损、降低人力成本、提高稳定性”。他保存,关掉,然后打开 IDE,继续写代码,写到了下班。

周二晚上十点,书房。他对着屏幕把内容过了两遍,第一遍四分四十秒,第二遍四分十秒,没有卡顿,没有超时。

对面那栋楼,亮着灯的窗户不多。三楼亮着,五楼亮着,八楼亮着。他看了十一个月的那扇,还是黑的。

他放下窗帘,躺下来,翻了翻身,面朝墙壁,睡着了。

周三下午一点四十分,他到三楼会议室,里面已经坐了几个人。纪衡坐在靠窗的位置,面前放着一台笔记本电脑。蒋辉坐在靠门的位置,面前放着那个文件夹,透明封面,里面夹着打印好的 PPT 页面,彩色打印的,有箭头,有表格,有绿色和红色的标注。

陈稳坐在靠墙的位置,没有带文件夹,没有带电脑,口袋里只有一部手机。

纪衡看了一眼手表,然后说:“一点四十五。开始。”

陈稳把手机连上投影。投影仪亮了,第一页投在白色的幕布上。

“结算系统七月改进报告。我讲三个部分。第一,拦截器灰度上线,数据对比。第二,规则引擎接入。第三,价值量化。”

他按了一下屏幕,翻到第二页。

“拦截器 settle.guard 于七月二十号灰度上线,选最低负载机器,截至目前运行七十二小时。累计拦截 1,843 次请求,全部通过,通过率百分之一百,零资损。”

他翻到第三页。

“对比数据:2024 年一至七月凌晨事故四次,2025 年两次,2026 年一次。该拦截器可覆盖历史七次中的六次,第七次根因为从库延迟,不在范围。”

他翻到第四页。

“规则引擎调度通知已于七月二十五号上线,增加重试机制,最多三次,间隔十五分钟。价值量化三版,最终方向为减少资损与降低人力成本。数据来源:2024 至 2026 年事故记录。”

他讲完了,看了一眼时间,四分十二秒。

会议室里安静了几秒。

纪衡没有说话,看着投影屏幕,看了一会儿,然后说:“数据来源是谁提供的。”

“事故记录。由数据组易文提供对比数据支持。”

纪衡点了点头,然后说:“拦截器什么时候全量。”

“计划本周内全量。已排期七月二十八号。”

“全量后怎么监控。”

“继续观察拦截器日志,异常告警接入值班手机。一周内无异常,摘灰度标签。”

纪衡在笔记本上敲了几个字,然后说:“可以。下一个。”

座位上的手机亮着,一条微信,是易文发的。

“讲完了?”

他回了一个“完了”。

易文回了一个“好”。

蒋辉把电脑连上投影。他的 PPT 第一页是一个标题,红色加粗,带下划线:“智能重试补偿方案——跨部门协同优化,提升结算可靠性与用户体验”。

他翻到第二页,是一张流程图,箭头从左上角出发,往右走,分叉,聚合,再分叉,再聚合,汇聚蓝色框,写着“补偿成功”。

“我的方案背景是这样的,”蒋辉说,“目前结算系统的补偿机制是手动触发,依赖值班人员发现异常后手工补录。这个流程存在两个问题。第一,响应时延——从异常发生到手工补录,平均耗时三十三分钟。第二,手工补录的数据没有幂等校验,重复补录的概率在百分之三左右。”

他翻到第三页,是一张表格,左边写着“当前流程”,右边写着“优化后流程”。

“我的方案是:在结算系统与商户数据之间加一个智能重试补偿层。当结算事务失败时,补偿层自动捕获失败上下文,进入重试队列,按优先级排序,自动重试。重试三次失败后,进入人工队列。”

他翻到第四页,是一张柱状图,左边标着“当前平均补偿耗时:三十三分钟”,右边标着“优化后目标:三分钟以内”。

“如果这个方案上线,可以把补偿耗时降低百分之九十以上。”

他讲完了,看了一眼时间,十一分零八秒。

会议室里安静了一会儿。

纪衡看着投影屏幕,没有说话。他翻了一下蒋辉的 PPT 页面,翻到第一页,看了一遍,又翻到第三页,看了一遍,然后说:“这个方案,跟陈稳的 settle.guard 有什么区别。”

蒋辉说:“settle.guard 是事务拦截,在事务开始前校验,防止异常事务进入数据库。我的方案是事后补偿,在事务失败后自动重试。一个是防护,一个是修复。可以互补。”

纪衡说:“那你的补偿层,核心逻辑是什么。”

“失败上下文的捕获与重试队列的调度。失败时,捕获事务 ID、失败原因、时间戳、商户 ID,存入重试队列。重试时按优先级排序,先处理影响大的商户。”

“这个逻辑,跟结算系统现有的重试机制有什么区别。”

蒋辉停了一下,说:“现有的是单次重试,失败后不再重试,直接进入人工补录。我的方案是多次重试,最多三次,每次间隔递增,最后一次失败后进入人工队列。”

纪衡在笔记本上敲了几个字,然后说:“你的方案里,有多少是现成的。”

蒋辉又停了一下,说:“重试队列的调度框架是现成的,但需要适配结算系统的上下文。失败捕获的逻辑需要新建,大概占百分之四十。”

纪衡点了点头,没有继续问。

“可以。方案先留着,等拦截器全量后再评估。”

蒋辉说:“好。”他拔掉电脑,回到座位。表情没有变化,只是他的手在桌面上放了一下,又拿起来,放在膝盖上,又放回桌面。

纪衡看了一眼手表,说:“下一个。”

组里那位资深工程师开始讲他的内容。陈稳听不进去。百分之四十需要新建,也就是说,百分之六十是现成的。现成的那部分里,有他上周在规则引擎里加的重试机制——最多三次,间隔十五分钟。

还有一个更具体的东西。蒋辉的重试队列按商户优先级排序,先处理影响大的商户。同一笔结算事务失败两次,两条补偿记录会分在不同批次里被取出来,中间没有幂等键。整个方案十一分钟,四页 PPT,没有出现“幂等”两个字。上一次因为没有幂等出事是六月十九号,重复补录一百七十四笔,复盘是他写的。

这件事陈稳知道。会议室里能问出这句话的人只有他。他没有举手。

资深工程师讲完了,纪衡说:“可以。”

纪衡站在会议桌前,没有连投影,面对着所有人。

“七月工作基本正常。八月的重点:第一,拦截器全量,按计划执行。第二,蒋辉的方案,等拦截器稳定后再推。第三,八月的双月会,我要看到每个人的数据同比环比。”

“散会。”

会议室里的人开始收拾东西。陈稳把手机装进口袋,走到门口,身后有人叫他。

“陈稳。”

他回头,是纪衡。

“你今天讲得不错。”

陈稳愣了一下,说:“谢谢。”

纪衡没有再说别的,拿起笔记本电脑出去了。

工位上的监控大盘是绿的、平的。结算成功率百分之九十九点九九,连接池使用率百分之六十七。陈稳打开 IDE,把重试机制那个类翻出来,找到 retry 方法,在参数列表后面加了一行注释:待确认——多次重试是否需要幂等键。他保存,没有提交。

茶水间的水是温的。窗外那栋楼的外墙还是灰色的,空调管沿着墙面往下走,在转角处拐了一个弯。

下班的电梯门关上的时候,一只手伸进来,挡了一下,门又开了。

是蒋辉。

他按了一楼。电梯门关上,缓缓下降。

“你今天讲得不错。”蒋辉说。

“你也是。”

蒋辉笑了一下,说:“纪总说等拦截器全量后再评估。你觉得什么时候能全量。”

“这周五。”

“那快了。”

电梯到了二楼,停了一下,门开了,没有人上来,又关上了。

“你那个重试机制,”蒋辉说,“跟我的方案有重叠的地方。我不是说要抄你的。我是说,如果我的方案上线了,你那个重试机制可以接过来,变成补偿层的一部分。”

陈稳看着电梯门上的数字,从 2 跳到 1。

“可以。”他说。

外面天已经黑了,路灯亮着,地面上有一层薄薄的水渍,不知道什么时候下过雨。蒋辉往左走,往停车场的方向。陈稳往右走,往地铁站的方向。

他走了一段,停下来,拿出手机,打开微信,看到易文发了一条消息。

“讲完了?纪衡怎么说。”

“他说讲得不错。”

易文回了一个“好”,然后补了一句:“下次别让他说这句话,让他在 PPT 上写。”

陈稳看着这条消息,看了几秒,然后回了一个“好”。

家里的茶几上,手机屏幕亮着,是发给纪衡的那份 PPT。四页,四分十二秒,纪衡没有打断,没有问“影响多少钱”,没有说“没有重点”。

书房里,他搜了“智能重试补偿 架构设计”,翻了几页,打开一篇技术博客,里面有一段话:“重试补偿与事务拦截是两种不同的设计哲学。前者假设失败是常态,后者假设失败是异常。一个系统应当同时具备两种能力。”

同一篇往下第三节讲的是幂等,小标题叫“补偿必须可重入”。他把这一节的链接也复制了,跟前面那段话贴在同一个记事本里,中间空了一行。

窗帘拉开。

对面那栋楼,亮着灯的窗户不多。三楼亮着,五楼亮着,八楼也亮着。他看了十一个月的那扇,还是黑的。

他放下窗帘,躺下来。

他闭上眼睛,浮现出蒋辉的 PPT 第一页——红色加粗标题,带下划线,下面是一张流程图,箭头从左上角出发,往右走,分叉,聚合,再分叉,再聚合,汇聚蓝色框,写着“补偿成功”。

他翻了翻身,面朝墙壁,盯着墙上的光,从窗帘的缝隙里漏进来,在天花板上拉出一条细长的白色线条。

他盯着那条线,盯了很久,然后闭上眼睛,睡着了。


← 第六章 PPT母版 · 目录 · 第八章 老梁走了 →