跳转至

第二十三章 · 谈话

十月十二日,星期一,上午七点。

十月十二日,凌晨五点四十分。值班日志最后一行是 05:12,资源池使用率百分之三十四,比昨天同一时刻高了六个点。陈稳把这一行截图存下来,没有发给任何人。

昨晚十一点到今晨五点,告警一共响了两次,都是同一个商户的重复提交,被拦截器挡住了。这是第四千二百二十三次和第四千二百二十四次。

天已经亮了,阳光照在路面上,很淡。手机上有何晚的消息。

「粥煮好了。在锅里,你自己盛。」

白米粥,没有放其他东西。他盛了一碗,喝了一口,很烫,放下碗等着。等的时候他又看了一遍那张截图。三十四这个数,值班表上写的上限是四十。

喝完粥,洗了碗,躺下,闭上眼睛。

他睡到下午两点。纪衡的消息是九点四十七分发的。

「下午四点,来我办公室一趟。」

上一次纪衡这样单独叫他,是八月二十八号,绩效沟通,那次的邮件写了「半小时」。这一次没写时长。

镜子里眼睛是红的,没有肿。他换了一件衬衫。

下午三点五十分,一号楼工位区人不多。资源池使用率百分之三十二,比早上降了两个点。

纪衡的办公室门开着。

纪衡抬起头。

「进来。」纪衡说。

桌上摊着一份打印稿,标题那一行有铅笔画的横线。

空调的声音,键盘的声音,外面有人说话,但听不清。这段时间大约四十秒。

纪衡抬起头。

「你昨晚处理了一个事故。」纪衡说。

「嗯。」

「复盘我看了。写得很清楚。做了什么,为什么这样做,效果怎么样。没有废话。」

技术版复盘一千二百字,他没有发。发出去的是汇报版,四百字。纪衡说的是那四百字。

「你那个消息服务,上线了,运行正常,没有受影响。」

消息服务的重试次数昨晚跳到过三次,日志里有,复盘里没写。

「你那个对账模块重构方案,我看了。时间表也看了。按你的计划执行。」

「好。」

纪衡把那份打印稿翻到第三页。

「我找你来,不是说这个。」纪衡说。

陈稳看着纪衡。

「你上周四做的方案评审,我后来跟技术 VP 聊了一下。他说,你讲得比以前好。但他问了一个问题,我没有答上来。」

纪衡把电脑转过来一点,屏幕上是陈稳那份方案的第三页。

「他问,这个方案做完之后,能推广到其他业务线吗。」

陈稳的方案里,第三页标题是「结算系统对账模块重构」。他自己写的时候,光标在「结算系统」四个字上停过一次,想过要不要删掉,最后没删。

「你的方案里,只写了结算系统。没有写其他业务线。」

「是。」

「为什么。」

「因为我只做过结算系统。」

纪衡看了他两秒。「这个理由,你在技术 VP 面前不要说。」

「好。」

「我问你一个问题。你那个数据治理的方案,跟这个对账模块重构的方案,能合在一起吗。」

陈稳知道能合。他在二号楼建的那三个视图,六十八行 SQL,本来就是给对账模块喂数据的。但他也知道,一旦说能合,这两个方案就变成一个方案,一个方案只有一个负责人,而数据治理的负责人是易文。

「你不需要马上回答。明天早上给我答案。」

「好。」

「还有一个事。你那个数据治理的方案,张磊那边已经推广到营销技术部了。周其正那边也在问,能不能用。」

这件事陈稳知道。张磊上周五给他发过消息,他回了一个「好」。他没有告诉易文。

「你之前写方案的时候,只写了结算系统。但你现在要想一下,如果别人要用你的方案,你需要准备什么。你那个数据加载接口,是按时间范围、商户 ID、对账类型批量查询。如果其他业务线要用,这些接口够不够。」

「不够。」

纪衡的手指在桌面上停住了。「哪里不够。」

「按时间范围查,走的是 settle_reconciliation 的联合索引。那个索引是我八月三号加的,只覆盖结算系统的四个字段。别的业务线的表结构不一样,走不了这个索引,会全表扫。」

「会怎么样。」

「跟九月十七号凌晨一样。」

纪衡把手指抬起来,又放下。「你回去看一下。明天早上一起给我答案。」

「你那个消息服务,跟蒋辉的智能重试补偿方案,还有资源冲突吗。」纪衡说。

「现在没有了。」

「为什么。」

「之前有冲突。消息服务跟规则引擎调度服务共用同一个资源池。昨天的事故之后,蒋辉说,消息服务不需要推后了。」

「他说的?」

「嗯。」

纪衡没再问下去。他把电脑屏幕转回自己那边,看了一会儿。

昨天那场 P0 的根因,是蒋辉那个没人 review 就合入的 MR,配置里的 topic 指向了消息服务。陈稳在群里只写了「已恢复,无资损」。纪衡手上有那份四百字的复盘,复盘里也没有这一句。

「你那个消息服务,接下来有什么计划。」

陈稳想了想,说:「继续观察。运行稳定以后,加消费者幂等逻辑,加 TTL 索引,加本地失败日志表。」

「谁写的。」

「易文标的注释。」

纪衡在打印稿边上写了两个字,笔尖压得很重。

「你最近跟易文走得很近。」纪衡说。

蒋辉在茶水间说过同一句话,用的是「啊」结尾。纪衡用的是句号。

「我不是说你不能跟她走得很近。我是说,你想清楚了吗。」

想清楚什么,纪衡没有说。这个问题的主语是空的。

「你不需要回答。明天早上给我答案。」

「好。」

「就这些。」纪衡说。

记事本上多了一行:十月十二日,下午四点。纪衡找我谈话。他问了四个问题。第一,对账模块重构能不能推广到其他业务线。第二,数据治理方案跟对账模块重构能不能合在一起。第三,推广需要准备什么。第四,我跟易文走得太近,想清楚了吗。

第四个问题他打了两遍才打完,第一遍写的是「我跟易文」,删了,重新写。

对账模块重构方案,从头看到尾,没有改。数据治理方案,从头看到尾,没有改。

茶水间窗外,阳光照在对面楼的玻璃上,反光,刺眼。

蒋辉在这个位置说过同样意思的一句话:你最近跟易文走得很近啊。有人会看到。蒋辉说这句话的时候,手里也端着一杯水。

记事本又多了一行:十月十二日,下午。纪衡说,你最近跟易文走得很近。蒋辉也说过同样的话。

两个人,不同的时间,不同的地点,同一句话。这件事他没有告诉易文。

第二遍看对账模块重构方案,一行一行看,四十分钟。数据治理方案,一行一行看。两份都没有改。

记事本第三行:十月十二日,下午五点半。两个方案都看了一遍。没有改。不知道怎么合在一起。

他把标题从「结算系统对账模块重构方案」改成「对账模块重构方案——事件驱动加增量比对,实现 T+0 实时对账」。原来只针对结算系统的描述,改成适用于所有业务线。改了半个小时,删掉,恢复到原来的版本。

他关掉方案,打开记事本,写一行:十月十二日,下午六点。改了一版,觉得不对,删了。

他看了一遍,保存,关掉。

他打开手机,看到易文的消息。

「听说纪衡找你谈话了。」

「嗯。」

「说了什么。」

「他问我,对账模块重构方案能不能推广到其他业务线。数据治理方案能不能跟对账模块重构合在一起。」

「你怎么回答的。」

「我说回去想一下。」

「你现在在想什么。」

他想的是纪衡最后那句「你跟易文走得很近」。这句话他没打出来。

「我不知道怎么合在一起。」他打字。

「你先把两个方案打开,放在一起看。」

左边是对账模块重构,右边是数据治理。两份文档的第一页格式一样,都是他照着纪衡那个 PPT 母版做的。

「然后呢。」

「看它们有什么共同点。」

他从头看到尾,看了一遍。字段对齐在左边,事件驱动在右边,中间隔着一整个屏幕的空白。

「数据治理方案,你做了什么。」

「字段对齐。三个表,一百多个字段,统一成了四十二个字段。」

「对账模块重构方案,你做了什么。」

「事件驱动加增量比对,T+0 实时对账。」

「这两个方案,有一个共同的东西。」

四十二个字段。他把两份文档并排缩小到百分之五十,还是没看出来。

「数据。」

这两个字他盯了大概三秒。

「数据治理方案做的是底层数据对齐。对账模块重构方案做的是上层数据比对。底层对齐了,上层比对才能做。这两个方案,本来就是一个整体。」

他在二号楼建那三个视图的时候,易文一句话都没解释过为什么要建。

「你把数据治理方案改成对账模块重构方案的第一部分。第二部分才是事件驱动加增量比对的实时对账。这样,两个方案就合在一起了。」

陈稳看着屏幕,没有说话。

「你试一下。」

「好。」

陈稳放下手机,打开对账模块重构方案,分成两部分。第一部分:数据治理。他把数据治理方案的内容写进去,字段对齐、视图创建、数据清洗,三页,全部写进去。第二部分:事件驱动加增量比对。

他写完了,看了一遍,觉得可以,保存,关掉。

他打开手机,看到易文的消息。

「改完了吗。」

「改完了。」

「怎么改的。」

「第一部分写数据治理,第二部分写实时对账。」

「可以。」

陈稳看着屏幕,没有说话。

「还有一个问题。」他打字。

「纪衡问,如果推广到其他业务线,需要准备什么。」

「你那个数据加载接口,是按时间范围、商户 ID、对账类型批量查询。如果其他业务线要用,你做成可配置的。业务线自己配字段名、字段类型、数据源。你不需要改代码,改配置就行。」

「你能做吗。」

「能。」

「那就做。」

陈稳放下手机,打开方案,在第三部分加了一小节:可配置数据加载接口,支持按业务线配置字段名、字段类型、数据源。

他写完,看了一遍,觉得可以,保存,关掉。

他打开记事本,写一行:十月十二日,晚上七点。方案改完了。第一部分写数据治理,第二部分写实时对账,第三部分写可配置数据加载接口。

窗外天已经黑了,对面楼的灯亮着,几扇窗,零星的。他看了一年多的那扇窗,灯是黑的。上一次那扇窗亮着,是九月的某一天,他没有记具体日期。

何晚的消息在手机上。

「你今晚回来吃饭吗。」

方案文档右下角显示已保存,时间十九点零四分。他还没有发给纪衡。

「我做了饭。」何晚说。

「你吃了吗。」

「还没。」

「我回来吃。」

家里是炒菜的味道。何晚系着围裙,锅里的油在响。

「回来了。」何晚说,没有回头。

「嗯。」

「洗手,吃饭。」

一盘青菜,一盘肉丝,一碗汤。何晚坐下来。

「你昨天没睡好。」何晚说。

「嗯。值班,处理了一个事故。」

「严重吗。」

「不严重。已经恢复了。」

事故不严重。资源池使用率从三十四降到三十一,用了六个小时。这两句他都没说。

「你吃粥了吗。」

「吃了。」

「吃了就好。」

何晚夹了一块肉放在他碗里。他夹起来,吃了。

「你胃不好,少吃肉。」

他又夹起来,吃了。

「你今天下午去哪了。」何晚说。

「公司。纪衡找我谈话。」

「说什么了。」

「说了几个事。问我方案能不能推广到其他业务线。还问我,跟易文走得近,想清楚了吗。」

「你怎么回答的。」

「我说回去想一下。」

何晚把汤碗往他那边推了两厘米。

「你那个易文,她教了你很多。」何晚说。

去年这个时候,何晚问他公司的事,他答的是「就那样」。三个字。现在他答了三十七个字,还带了两个人的名字。

「你以前不说谢谢。你以前觉得,什么事情都是应该的。你帮别人做事,别人帮你做事,都是应该的,不用说谢谢。你后来说谢谢了,是因为你开始在意别人怎么看了。」

这句话陈稳没有反驳。他确实不记得自己是从哪一天开始说谢谢的。

「你那个方案,能推广就推广,不能推广就算了。你不需要想太多。你那个纪衡,他问你跟易文走得近,想清楚了吗。你不需要想清楚。你跟她走得近,是因为她教了你东西。你学到了,就够了。」

何晚说完,拿起筷子,继续吃饭。

他夹了一块青菜,嚼了,咽下去。何晚说的「就够了」,和纪衡明天要的答案,不是同一件事。这一点他知道,没有说。

吃完饭,他洗了碗。手机上有易文的消息。

「明天早上,你给纪衡的答案,想好了吗。」

方案文档还没有发出去。发送对象一栏是空的。

「想好了。」他打字。

「你的答案是什么。」

「第一,对账模块重构可以推广到其他业务线。第二,数据治理方案跟对账模块重构可以合在一起。第三,可配置数据加载接口,支持按业务线配置字段名、字段类型、数据源。」

「第四呢。」

第四个问题是「我跟易文走得太近,想清楚了吗」。这个问题他不知道该怎么打出来,光标在输入框里停着。

「你不需要回答纪衡的第四个问题。他问你想清楚了吗,你不需要回答清楚还是不清楚。你只需要说,你学到了什么。他问,你再说。他不问,你不说。」

「好。」

天花板是白的,没有裂缝。

十月十三日,星期二,上午九点。

资源池使用率百分之三十一,比昨晚又降了。纪衡的办公室门开着。

纪衡抬起头。

「进来。」纪衡说。

椅子还在昨天的位置。

「答案想好了吗。」纪衡说。

「想好了。」陈稳说。

「说。」

「第一,对账模块重构方案可以推广到其他业务线。第二,数据治理方案跟对账模块重构方案可以合在一起。第三,如果要做成平台方案,需要加可配置数据加载接口,支持按业务线配置字段名、字段类型、数据源。」

纪衡的手指在桌面上停住了。

「方案我改了一版。把数据治理方案的内容改成对账模块重构方案的第一部分,第二部分是事件驱动加增量比对的实时对账,第三部分是可配置数据加载接口。」

「发我看一下。」

纪衡看完,把手机放在桌上,屏幕朝下。

「你昨天改的。」

「嗯。」

「谁帮你改的。」

这个问题有两个答案。一个是「没有人」,一个是易文的名字。前一个答案纪衡不会信,因为昨天下午四点他还答不上来。

「易文?」纪衡说。

昨晚十一点四十分那段对话,微信记录还在他手机里,第三十七条。

「你方案第三部分的可配置数据加载接口,是你自己想的,还是她帮你想的。」

陈稳想了想,说:「她帮我想的。」

纪衡把手机翻回正面,又翻了过去。

「你跟她学了很多。」

这句话纪衡今天说了两遍。第一遍是问句,第二遍不是。

「你学到了什么。」

陈稳想了想,说:「我学会了,写方案的时候,要写别人能执行的。」

纪衡等着。

「还有呢。」

陈稳想了想,说:「我学会了,说问题,不要说事实。」

纪衡把笔放下了。

「你跟她学了很多。但你要知道,你学的东西,最后是你自己的。不是她的。」

这句话和何晚昨晚说的「你学到了,就够了」,字面上很像,落点不一样。哪里不一样,他当时没想明白。

「你那个方案,我看了。可以。按你的计划执行。先做结算系统,做完了,再跟张磊对接,看他那边需要什么。消息服务加幂等逻辑、TTL 索引、本地失败日志表。」

「好。」

「就这些。」

记事本上多了一行:十月十三日,上午九点。纪衡说方案可以。按计划执行。先做结算系统,做完再跟张磊对接。消息服务加幂等逻辑、TTL 索引、本地失败日志表。

这一行他没有写纪衡说的最后那句话。

消息服务代码里,他开始写消费者幂等逻辑。写到中午,加了一行注释。

-- 已消费消息表,去重,定时清理超过七天的记录
CREATE TABLE IF NOT EXISTS settle_message_consumed (
    message_id VARCHAR(64) PRIMARY KEY,
    consumed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_consumed_at (consumed_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

他写完,提交 MR,commit message:feat: 消息服务加消费者幂等逻辑——已消费消息表去重,定时清理超过七天的记录。

记事本最后一行:十月十三日,中午。消息服务加消费者幂等逻辑。提交 MR。

茶水间窗外,阳光照在对面楼的玻璃上,反光,刺眼。

你跟她学了很多。但你要知道,你学的东西,最后是你自己的。不是她的。

这句话的意思是,以后不要再问她。

他把水喝完,杯子放进水池。手机通讯录里,易文的名字在第七个。他按到那一行,停住,屏幕在三十秒后自己黑了。


← 第二十二章 P0 · 目录 · 第二十四章 电话 →