不怕一万,只怕万一呀,朋友。
程序员
从前,有个程序员叫小明,他在开发一个股票的投资组合功能。这个功能简单的来讲,就是一个投资组合里有现金、股票等资产,咱们根据组合里股票涨跌等状况,给出一个总体组合的指数,以评判组合的水平。数据库
聪明的小明在开发的时候就发现了,若是存在现金为0,而且所持有的股票都退市了的话,这个股票指数的计算就会存在问题。小明想:“现金为0的状况不多,退市的状况就更很少,这个状况很极端,确定不会遇到,实现异常状况处理的逻辑也很复杂,测试确定也发现不了,无论了”,因而代码就欢快地跑到了线上。网络
随着业务的发展,投资组合愈来愈多了,也随着政策的转向,退市的股票也陆陆续续地变多了。某一天,夜里跑批报错了!告警短信在夜里发到了小明的手机了,小明只好半夜跑来公司排查问题,原来以前考虑的状况真的出现了,小明内心暗骂了一句,还TM真的出现这状况了!骂归骂,小明运用他聪明的大脑,从新看了一遍逻辑,分析了各类状况,而后给出了在这种状况下指数的跑批值应该是多少,通过一次又一次战战兢兢的复核计算,最后战战兢兢地把数据一条一条地更新到了数据库。通过一番折腾后,已经快早上5点了...次日跟领导解释了状况,说这种状况不多见,咱们后续抽时间把这块的逻辑补上!架构
然而在此次事故的不久以后,小明还在想啥时候开始补这块逻辑时,小明夜里又收到了投资组合模块的告警短信.....框架
从前,有另一个程序员叫小王,他在作一个完成交易时给用户的积分帐号加积分的功能,订单与积分在不一样的数据库,这涉及到一个分布式事务的问题。分布式
聪明的小王早就知道了有不少形态能够解决这个问题,最合适的固然是MQ,可是目前系统没有MQ要额外加入维护,很麻烦;TCC也能够,但要写额外的代码,也好烦;2PC嘛,好像没有合适的,性能也听说不高,不选;Best Efforts 1PC,这个不错!性能比2PC高,无需额外编码,大多数状况下能有强一致性保证,惟一可能出现异常的状况就是在commit阶段,若一个数据库事务提交了,另一个数据库事务因为宕机提交失败的话,才会出现不一致,这状况多少见呀!就Best Effors 1PC啦!出问题我手工给他补上就好啦。性能
因而代码就轻松愉快地上线了。学习
随着业务的发展,业务范围和交易量也在逐步地变大,小王写了一个新功能准备更新到交易服务里,公司里有超强的滚动发布,上线过程很愉快的就完成了。完成验证后,小王心满意足地跑回家睡觉了。测试
这个小王比较幸运,睡到了次日上班。而后客服部传来消息,说客户投诉,其交易没有产生积分!小王一会儿就猜想到多是昨晚滚动升级服务下线的时候,没有作优雅停机相关代码设计,致使Best Effors 1PC失败了,因而小王翻了下日志和数据,排查出果真是这个问题致使的,实际还有额外几条数据也有这问题,小王一并修复了这些数据问题,虽然小王很聪明,但这个修复过程也占用小王一上午的时间。同时,小王也决定,给加上优雅停机的相关逻辑。后来再也没有出现过因为更新致使的不一致了。编码
再随着业务的发展,用户交易量也跟着上去了,然而在一个交易较为频繁的时段,忽然飚出来不少告警,机房内网络也不稳定,通过一排查,原来是网络设备出现了问题,通过一小段时间折腾网络恢复了正常。而后小王内心带着忐忑地去翻看交易服务的日志,发现出现了大量的报错,还有很多报错是显式提示BestEffors1PC在Commit阶段的错误!统计了一下,此次可不是手工能解决的问题了.....
小王写了一个批量数据修复程序,开始在生产跑了起来,但小王开始想,我用BestEffor1PC是对的么?
相信你们都听过墨菲定律,就是说,你越担忧的事情,越有可能发生。
固然,这不符合咱们程序员严谨的风格。咱们万事都要量化。小明同窗的案例中,即便出现的几率是万分之一,但当组合数量达到十万个呢?达到百万个呢?是否是就会变得常常出现了呢?小王同窗的案例里,因commit要走网络等IO,这个整个过程要1-2毫秒不过度吧?当TPS增多,这个1-2毫秒的危险窗口是否是就遍及整个时间范围了呢?这个时候随便发生下网络抖动,会怎样呢?
写程序有一个特色就是,写了一次,计算机会帮你执行无数遍,而你无需付出任何额外努力。但咱们人工重复执行一件事情,却要咱们每次都付出精力与时间。
若是咱们在写代码时放过的万一通过的评估是:一年都不会发生一次的话,我的认为你是能够强行闭上眼睛无论这个万一的。
可是谁能评估准呢?当发生了的时候,你要作的补救措施就是你当时遗漏的逻辑。当发生须要人工补救的状况时,所需付出的努力甚至要远大于你当时完成这段逻辑付出的努力。
所以,小明和小王以后都懂得了 “出来行,早晚要还”的道理,再也不放过任何一个万一。
做者简介:某信用卡中心架构师,多年金融行业经验,从联机交易到深度学习都有所涉猎,开源分布式事务框架EasyTransaction做者。欢迎关注我的公众号,在这里我会分享平常工做、生活中对于架构、编码的思考。