家里有做程序员的领导,他曾经说过的工作中出错的一件事情让我印象深刻!
那次他们负责一个24小时运转的大型工厂项目,就是在厂区有多个工作站,将各自负责 数据收集后传至服务器处理。软件系统上线运行后,发现有时工作站在运行过程中会偶尔不明原因死机,但是现场工作人员一般直接重启一下电脑就又正常运行了。因为数据都已实时上传备份至服务器,工作站重启后也没什么影响,次数不多,大家也都基本忽略了这个问题的存在。(更何况造成电脑死机的原因很多,不一定是软件方面的问题。)
直到有一次,半夜被现场人员紧急呼叫:整个厂区的工作站都死机!整个厂区工作接近瘫痪了!
于是紧急排查,发现是服务器死机!
为什么服务器死机会造成所有工作站死机?!
追踪代码发现是代码里一个小bug!
原来工作站向服务器发送数据时的 步骤是:第一步:向服务器发送握手信号(表明我要发送数据了);第二步:服务器接收到握手信号后向工作站发送一个已经准备接收数据的信号;第三步:工作站收到服务器准备接收的消息后,开始发送数据;第四步:完成!
乍看之下,没有任何问题,步骤明确!可是问题就出在第一第二步上!没有考虑到特殊情况!
当第一步工作站发送握手信号时,默认就在等第二步的回应了!可是当服务器有问题(死机)时,它没有给工作站回复握手信号,然后工作站就一直在等待中……直到工作人员认为它死机了……
为什么以前工作站死机再重启就好了?
因为机房有工作人员将服务器已经重启了,所以工作站再重启就好了!
为什么这次全部工作站都死机?
因为机房服务器值班人员脱岗了!长时间没有发现服务器死机!
等等?!为什么会有机房服务器工作人员脱岗?!服务器有专人看着?!是的!因为原来发现服务器有过这样现象所以安排了值班人员24小时值班,专门看管服务器,任务就是在发现服务器死机后立刻最快时间重启!
啊?!问了现场负责的为什么这样操作,对方说人家厂区一直都是这样,以前的系统也是这样,机房服务器工作人员24小时值班,主要的任务就是负责各种服务器重启!
这边以最快速度加了几行代码!
在工作站端加了一个容错处理,当工作站准备传数据时,在*秒内等不到服务器的回应,就暂存数据在本地,然后处理下一个任务。顺便给服务器发送一个让服务器重启的命令!然后在下一个时间段再尝试去和服务器连接!
死机的问题完美解决!顺便解决了机房必须24小时小心翼翼值班的问题!(不用再刻意时刻关注是否死机了)
问题的根本就是大家都是在以惯性思维去解决问题,最初写代码的程序员默认服务器永远都不会出问题,没有考虑过服务器也会死机!而机房的工作人员也以为服务器重启必须靠人工来解决,根本没想过让软件自身来处理这个问题!心疼那些值了好多夜班的机房工作人员!