今天写文章不太有状态,憋了半天没憋出一句话。
可能,黔驴技穷。
讲个故事吧,之前在上一家公司发生的一次生产事故。
上一家公司做的是支付相关的业务。
专业名词是聚合支付。
可以理解为把支付宝,微信还有其他支付渠道汇总成一个二维码。
场景就是,你去买东西,不管用微信扫码,还是支付宝扫码,还是其他,可以扫同一个二维码来完成支付流程。
有一次上线部署这套系统时,发生了巨大bug。
大家正常使用app发生一些bug,可能就页面打不开。卡死之类。
顶多是用户体验不好。
但是,支付相关的,是和钱打交道的。
扣款流程出现bug,可能分分钟几百万的账就走错了。
然而,这次偏偏还正好是支付流程出现了问题。
啥问题呢?
大家想一个场景,比如你要买一瓶雪碧,然后你扫完二维码,输入完密码,之后的流程就是,我们这套系统会去你的账户扣款,如果扣款成功,那么商户就会收到“钱已到账”的信息。
问题出在哪呢?
系统把扣款失败的信息,处理成了扣款成功。
这就很要命了,你账户上明明只有1元钱,根本不够买雪碧的。
然而,系统却告诉商家,扣款成功了。
这笔钱是需要第二天和商家对账结算的。
如果钱追不回来,那就要赔偿给商家。
好巧不巧,当时系统对接了某手机品牌的线上商城,相当于是系统的商家。
他们正好在做活动,当天购买的人很多。
一天下来,这种本来买不起,但是系统误判扣款成功的流水就两百多万。
第二天系统对账,傻眼了。
这钱根本就没扣成功,但是商城那边已经发货了。
两边的大佬开始对接。
商家那边的观点是,我收到你扣款成功的消息,才开始发货。责任肯定不在我们这边。
也确实是这个道理。
最后怎么解决的呢?
银行内部悄悄写了个定时任务,到点就自动去扣这些占便宜用户的账户。每小时去扣一次。
扣了一个月,追回来80%的损失。
不过,这种操作是违规的,未经客户允许,擅自扣款。所以是内部操作。
被银监会知道的话,要挨处分。
怎么会出现这种bug呢?
接口调用的时候,有通信成功和业务成功两层报文。
通信成功的前提下,判断业务成功才有意义。
然而,系统却把通信成功,业务失败这种情况,当成了扣款成功。
这种级别的生产事故,暴露开发流程的重大问题。
开发组的同学留下这种低级bug。
测试组的同学也没测出来这个bug。
原本6个月年终奖,没了。
网友评论