为什么要设置HTTP timeout?

这个问题,我想反过来思考,如果不设置HTTP timeout,会对程序有什么影响?

一个线上Bug

上上周,同事维护的一个服务出了点故障,每5分钟执行一次的定时任务突然不执行了。同事查看日志,找不到任何异常信息,但是该定时任务就是卡住了。一开始我们走了弯路,最后用jstack找到了问题的原因。
006U7mfDgy1fz735lfmepj315u0lutcf.jpg
从上面的堆栈信息,可以发现该定时任务线程处于“RUNNABLE”状态,这个状态表明线程正运行在JVM中,但一直在等待操作系统的其他资源。很明显,该线程一直在进行Socket的读取操作,底层操作系统一直没有将结果返回给Socket进行读取。这么长时间了,如果设置了超时时间,线程早就异常,并结束了。我们回去看程序代码,发现这个项目的HTTP工具类真的没有设置timeout,赶紧让同事去修复这个bug。

这个Bug足以证明,如果不设置HTTP timeout,是会让你的程序存在潜在问题的。正常情况下,即使服务器响应缓慢,也不会像这次线上的情况那样,几个小时不返回结果。其中的原因,我会另写一篇随笔进行探讨。

为了你的程序能够正常运行,不浪费时间寻找Bug,也为了你的程序用户体验,请一定记得在HTTP调用时设置timeout。举一反三,进行任何远程调用时,都应该进行超时时间设置,因为网络是不可靠的,第三方服务也是不可靠的。

总结

回过头来思考,为什么一个生产项目会这么低级的Bug?事实上,对于远程调用,设置超时时间是一个常识,不是笔者公司的开发水平差,产生这个Bug的根本原因是大家对细节的不重视。笔者写下这篇随笔的原因,是希望自己和看到这篇随笔的朋友们引以为鉴,注意细节,发现细节,防患于未然。

转载于:https://www.cnblogs.com/bluemilk/p/10292232.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值