周一早上开始,对账单导出这个接口在预发上一直返回 {"code":500,"msg":"系统繁忙"}。
先交代背景:这个接口是给运营导月度对账单用的,一个月跑一次,之前一直是人工在后台点。我这块小模块独立负责之后,把它改成了定时任务,顺便加了个手工触发的口子。上线前我在本地跑了十几遍,正常。到预发,第一次点,500。
“系统繁忙”这四个字是我们全局异常处理器的兜底文案。我理解的是它会同时把真实异常打到日志里。后来发现确实会,但那是我第三天上午才知道要去看那个日志文件。
第一天我在代码里加日志。从 controller 开始,一层一层往下加,加到最后发现,根本走不到我加的那些行。那句“系统繁忙”到底是从哪抛出来的,我到现在也没完全搞明白(这里我可能想复杂了,反正它不是重点)。
哦对,第一天我还怀疑过编码。因为导出的文件名里有中文,我第一反应是文件名编码。又怀疑时区,对账单是按月切的,我以为 yyyy-MM 和服务器时区差八小时,把月份切错了。还写了好几个用例去锁这个边界,24 号、31 号、跨年那个月,全跑了一遍,都是对的。
第二天我开始怀疑并发。定时任务和手工触发可能会撞一起,两个线程同时往一个文件里写,我想这确实有可能出问题。然后我把临时文件名改成带 UUID 的,加了锁。改完,还是 500。跑完还是 500。
下午我实在没辙了,去找组长,他说“你看过预发的日志吗”。我说我没权限。他说去申请。
(权限这块是我们这边的流程,我不好说什么,只能说流程有流程的道理。)
第三天上午权限下来,我登上去 tail -f 了一把,一眼就看到了。`File