这个问题,我想反过来思考,如果不设置HTTP timeout,会对程序有什么影响?
一个线上Bug
上上周,同事维护的一个服务出了点故障,每5分钟执行一次的定时任务突然不执行了。同事查看日志,找不到任何异常信息,但是该定时任务就是卡住了。一开始我们走了弯路,最后用jstack找到了问题的原因。
从上面的堆栈信息,可以发现该定时任务线程处于“RUNNABLE”状态,这个状态表明线程正运行在JVM中,但一直在等待操作系统的其他资源。很明显,该线程一直在进行Socket的读取操作,底层操作系统一直没有将结果返回给Socket进行读取。这么长时间了,如果设置了超时时间,线程早就异常,并结束了。我们回去看程序代码,发现这个项目的HTTP工具类真的没有设置timeout,赶紧让同事去修复这个bug。
这个Bug足以证明,如果不设置HTTP timeout,是会让你的程序存在潜在问题的。正常情况下,即使服务器响应缓慢,也不会像这次线上的情况那样,几个小时不返回结果。其中的原因,我会另写一篇随笔进行探讨。
为了你的程序能够正常运行,不浪费时间寻找Bug,也为了你的程序用户体验,请一定记得在HTTP调用时设置timeout。举一反三,进行任何远程调用时,都应该进行超时时间设置,因为网络是不可靠的,第三方服务也是不可靠的。
总结
回过头来思考,为什么一个生产项目会这么低级的Bug?事实上,对于远程调用,设置超时时间是一个常识,不是笔者公司的开发水平差,产生这个Bug的根本原因是大家对细节的不重视。笔者写下这篇随笔的原因,是希望自己和看到这篇随笔的朋友们引以为鉴,注意细节,发现细节,防患于未然。