在我的技术交流群里,看到有朋友讨论实现重连问题,说说我自己对这个问题的浅见。
重连接不如重启;尽力维持稳定不如让它崩溃。
当程序内部状态已经紊乱,而我们无法控制,或许这是第三方库或框架的问题,或许这是其它同事学艺不精的问题。与其我们花费大量精力去解决,想方设法找一种让程序永久不停的解决方案,不如我们使用简单的脚本语言写一个简单的守护,由这个守护程序去重启动我们的应用程序,那么我们的应用程序就可以轻松的退出,就在它无法维持正确状态的时候。简单了就使程序容易控制,bug相对少而且容易查找,那么我们就能保证守护程序相对稳定,因此把一个小小的守护程序做稳定,远比把一个不停变化的应用系统搞稳定容易得多。
守护程序不稳定怎么办?很多新手担心应用系统和守护一起死掉,有这种担心是正确的。为解决这个担心,一般采用两级守护:一级守护,负责守护应用系统;二级守护,负责守护一级守护程序。这样就把同时死掉的几率下降很多了。那是不是为了安全,我们搞个十级、二十级守护,这就繁琐到杞人忧天的地步了,如果真有那么不稳定,我们应该检查程序,提高我们代码质量,好好考虑开发人员的素质和工作态度了。
当然,简单的程序退出,是否影响应用系统的业务逻辑完整性?是不是我们的应用系统本身不允许简单的退出?这个问题很复杂,看你自己怎么设计这个系统的。为了达到能简单的退出,一个可能的解决办法就是,在架构上保证,在协议上保证,遵循《unix编程艺术》上的设计原则是很重要的。
早年我力求把程序写得很稳定,也要求周围的人把程序写得很稳定,回头看其实从来没达到过。主要是技术不行,别人就更无法把握,就算自己是主管,也逼迫不了别人。
记得曾经有一个客户端是用java写的,它本身是一个后台服务,收集地市服务器的日志和运行状态,当时采用mina框架,v0.9的版本。为了socket断开后的重连接,程序员写了很多代码,两三个while循环,最后竟然不稳定。写了这么多代码,能达到预期目的还好,达不到还费力,就郁闷了。我也没时间去查什么bug, 是不是mina使用不对啊什么的。后来,我直接叫他们把那些检测和重连的代码删除,程序一旦发现连接不了中心服务器,直接退出算了,我使用bash写了一个简单的守护,负责重启动它。这个问题就这样简单的解决了,本来这个后台服务也要求不高,直接退出没有什么业务逻辑问题。
守护是不可靠的,最终还是需要人来维护。守护配合一定的监控报警手段,让维护人员及时发现问题初现,及时解决软硬件问题,才是解决之道。
当然,程序稳定性还是要程序本身稳定,如果程序不停core,守护不停重启,有什么作用呢。