要说这个ff139,真是搞得我焦头烂额。事情是这样的,我们有个老系统,就那种祖宗级别的,平时跑得好好的,但一旦碰上月底跑报表,时不时就卡壳。一卡壳,日志里准能看到这么一行:Error ID: ff139 – 交易数据异常。这玩意儿简直就是个鬼代码,以前从来没见过,偏偏又把我们核心的交易数据给卡住了。当时我就头大了,这可不是开玩笑的。
刚开始遇到这问题,我第一反应就是去翻文档。公司内部的维基,各种历史遗留的说明文档,全给翻了个遍。结果?毛都没有!ff139,这个代码就像凭空冒出来的一样,没有任何解释。问了组里的老哥们,他们也都是一脸懵逼,有的说“可能是什么老接口返回的”,有的说“是不是数据库连接问题”,反正都是猜。那天晚上,我就坐在电脑前,看着屏幕上的ff139,感觉就像被判了死刑一样,啥也干不了。
ff139的漫漫追查路
没办法,文档指望不上,人也指望不上,只能自己撸起袖子干了。我先是怀疑是不是数据格式的问题。我们系统对接的外部平台好几个,每个数据结构都大同小异,但又总有些细微差别。我就把出问题的那个月的交易数据导出来,一行一行地查,看有没有不符合规范的。那几天,眼睛都快看瞎了,Excel表格里几十万行的数据,看得我头晕眼花。结果查了三天,啥异常格式的数据都没找出来。白搭!
我又怀疑是不是代码逻辑有问题。这个跑报表的核心模块,代码至少是五年前写的了,注释少得可怜,变量名也是各种拼音缩写,看着就眼花。我硬着头皮,从头到尾,一点点地捋逻辑。遇到看不懂的地方,就自己写小demo去复现,去打印中间变量。那段时间,办公室的灯经常是我走的时候才关的,回去老婆都问我最近是不是在外面兼职了。就这么一点点地扒拉,才发现,原来中间有个地方,处理某个特定类型的交易时,如果原始金额是零,它会跳过一个校验。当时我就想,会不会是这个地方出的问题?
我立马改了那段代码,把那个校验补上,想着这下总该成了?结果?屁用没有!ff139依然故我,月底一到,准时出现。那时候我真的是要崩溃了,感觉就像一拳打在了棉花上,一点着力点都没有。那天晚上,我对着电脑屏幕发呆,突然想起来,以前有个同事提过,说老系统里有个“隐形配置”,专门用来处理某些特殊情况的。但我当时也没在意,以为就是口头玩笑话。
真相大白:ff139的庐山真面目
就凭着这个“隐形配置”的模糊记忆,我开始在服务器上翻找那些平时根本不会看的文件。什么配置文件、启动脚本、甚至一些看起来像是历史遗留下来的脚本文件,我挨个儿地开,挨个儿地看。就像大海捞针一样,根本不知道要找什么。翻到快半夜的时候,眼睛都快睁不开了,突然在一个叫做legacy_*的文件里,我看到了这么一行:ENABLE_FF139_EXCEPTION = FALSE。我当时就愣住了,ff139!这不就是我找了半天的鬼代码吗?
再往下看,下面还有一行注释,是用繁体中文写的,而且是很老旧的编码,我转码了好几次才看清楚: “此项用于处理某年某月因数据迁移导致的极少数异常交易,通常为金额为零且类型为特定码的交易。建议生产环境设为TRUE,开发测试设为FALSE。默认值为FALSE。” 卧槽!当时我心里一万头草泥马奔腾而过。原来不是代码逻辑有缺陷,也不是数据格式不对,而是特么的一个旧的、默认设置为关闭的异常处理开关!因为历史数据迁移遗留的问题,有一小撮金额为零的特定交易,在报表统计的时候会被这个“ff139”标记为异常,因为它没走常规的校验路径。
找到症结之后,我立马跟领导汇报了情况,然后小心翼翼地把ENABLE_FF139_EXCEPTION改成了TRUE。然后我们又跑了一遍月底的报表。这一次,整个过程顺畅无比,没有任何卡顿,日志里也再没见到那个烦人的ff139。所有的交易数据都顺利处理了,报表也按时出炉了。当时那种感觉,真是如释重负,比连续熬夜加班十天写完一个项目还要爽!
这ff139的最新消息就是:它根本不是什么bug,也不是什么错误,它就是个被人遗忘在角落里的老开关,一个用来处理特殊历史遗留问题的“补丁”。我把这个事儿记录下来,就是想告诉大家,有时候我们遇到的问题,可能根本就不是问题本身,而是那些被时间掩盖住的“前尘旧事”。挖出来,弄明白,才能真的解决问题。折腾了小半个月,终于把这个老骨头给啃下来了,真不容易。
