最近接到很多同学发来的消息说,雷子,我很爱看你写的关于日本IT行业各种狗血八卦的文章。可是你天天总是八卦别人,难道你自己就从来没出过bug咋的?
。
。
。
。
。
。
搞siao!雷子这么内外兼备,才华横溢,英明神武,震古烁今(此处省略一万字)……咳咳,那个啥,就算犯傻,我也要傻出新姿势,傻出新高度……
话说哪个攻城狮能没出过BUG啊,这不科学!雷子今天就来讲一个由于自己傻逼,删掉了用户本番数据的真实故事吧。
本番:是指系统上线后的真实运行环境
当然,写这个文的目的不是想用自己的傻逼来震慑大家,主要是年头久了,经验心得还是有一些的,觉得分享出来,如果能让新人后辈们少走一点点弯路,也是极好的。同行们见笑了!
OK,故事开始。Longlongtimeago,雷子还是个刚刚来到日本,满脸胶原蛋白的单纯小伙砸。当时参加了一个光开发就两年多,巨苦逼的项目,系统本番上线以后,也是大小问题不断。谁开发谁治理,所以我毫无悬念地担当了运用维护(保守)的工作,运维的合同期间是1年。
运用维护么,大家都懂的,需要7x24小时都有人守着。我那个时候主要是负责夜间运行的批处理。系统刚上线,还不稳定。有时候,夜里1点多打车到家刚洗了睡下,然后可能5点钟又被一个电话叫起来回去处理问题了,后来公司都不好意思了,干脆在旁边酒店给我包了个房间。那阵子,有两个月加班费都快比工资高了。唉,这辈子再也没干过比它更累的项目了。
以上是背景。系统上线几个月后,一天,PM找到我。
PM:用户反映,最近系统性能越来越慢了。得想办法解决一下。
我:可能是过期数据越积累越多,太消耗资源了吧。
PM:要不,加个定期运行的脚本,删掉一部分过期数据吧。
我:那好吧。我去写脚本,写完了找你review。
为了方便同学们理解,简单说明一下。
这个系统的核心数据部分,没有使用关系数据库,而是采用了独立设计的数据结构。数据装在数据容器里面,就好像一个萝卜占一个坑。如下图所示:
坑的数量是固定的,大概有几万个。每个坑都有一个编号,即数据地址(上图里的黄色数字)。
每天都有新数据(上图里的胡萝卜)进入到这个系统里。新数据进坑的同时被分配一个自动增加的数据编号(上图萝卜头上的红色数字),不会重复。
在白天online的时间段,这个系统的使用者会对新数据进行人工处理,新数据被处理以后,就变成了白萝卜,即过期数据。
过期数据不会自动消失,需要执行删除命令来清空。如果不清空的话,数据越来越多,在那里长期占着资源,就会导致系统变慢。PM让我做的事情,就是把白萝卜找出来,拔掉。
在这个数据结构里,当我想找到一条数据的时候,可以发出一个查询命令。这个查询命令允许使用数据编号或者数据地址这两种方式。比方说“5号萝卜”,或者“8号坑里的萝卜”。
这么一解释,同学们就大概明白了吧。我和PM商量了一下方案,初步确定每天删除条过期数据。
有同学问为啥不能把白萝卜一下子全都删掉?因为运行删除脚本的时间非常有限,只能在两个日常的批处理之间见缝插针地执行,也就够删除条的。
我和PM制定了一个计划:每天白天online的时段里,用查找脚本程序找出根白萝卜的编号列表,保存在文件里。晚上执行batch的时候启动删除脚本,导入编号列表,把指定的白萝卜删除。
为了提高删除时数据查询的速度,生成的编号列表文件采用了指定数据地址(坑编号)的方式。生成出来的删除列表大概就是下面这个样子。
按照最初的计划,这个临时脚本运行了一段时间。白天找萝卜,晚上删萝卜......倒也没出啥问题......直到有一天,PM又来找我了。
PM:这个周六和周日两天晚上,系统要做升级维护,每天会有几个小时暂时停机。这几个小时内能运行删除脚本,咱们搞个大的!
我:(估算了一下)那我先做个1万条数据地址的列表,看看第一天运行的时候能删除多少。要是差不多都能删掉的话,第二天再做1万。
PM:好,就这么搞着。
第一天不是我值夜班。我做了个1万条过期数据地址的列表,交给了值夜班的人,告诉他:系统停机后手动启动脚本,尽量跑,一直到停机时间即将结束之前再中止。在这段时间内删除了多少条,短信告诉我结果。
为此,我还特地修改了删除脚本程序,设定了一个运行中途能够从外面正常中止的开关(就是每删除一条后检测stop文件是否存在之类的),并且在程序终止后输出一共删除了多少条。
周六一夜无事。周日早晨我看了一下手机,值夜班的同事短信告诉我,停机的那几个小时里,删除了5千多条。
只有5千多条,看来删除的性能比我预计的要低啊。估计是其他做升级的组也在更新数据吧,有资源冲突。
周日晚上是我值夜班。我和PM商量了一下:昨天的列表里还剩4千多条没删完,今天停机的那几个小时也就够删除这些了。干脆,也不用重新生成,继续用昨天的那1万条的列表运行算了。
PM说,行。
夜里,停机时间到了,我启动了删除数据的脚本,参数指定为前一天的那个列表文件。
貌似一切顺利。删除脚本在停机时间内正常结束,结果显示:删除了4千多条数据。
我一边打着哈欠收拾东西,一边把昨天和今天的结果数字在心里相加了一下。
哎?翘掏妈待?两天的结果之和超过了1万?
我全身一激灵,一下子就清醒了。揉揉眼睛,再算了一遍。结果还是超过了1万,多了几百条。
我开始冒冷汗了......
哎?哎?
肿么回事?
我啥地方整错了?
删除脚本有什么问题?
还是列表文件出了什么问题?
这多出来的几百条是从哪里来的?
我到底删掉了什么东西啊啊啊啊啊啊啊!
再过几个小时,online就要开始了啊啊啊啊啊!
。
。
。
。
。
。
互动抢答
各路高手们,你看出来了问题出在哪里吗?
雷子在上面的文章里,埋下了很多线索。有的线索是导出问题的关键,也有一些是为了混淆视线故意加进去的。
如果你发现了问题出在什么地方,在下面留言的地方把你的推断写出来吧。
按照时间先后,回答正确的前10名同学,会有北京市白癜风医院哪家最好北京中科医院曝光