最近的迭代转测后,遇到了一个比较有意思的问题。系统在测试环境整体运行还算平稳,但是过一段时间之后,就开始有接口超时了,日志中出现非常多的 “java.net.SocketTimeoutException: Read timed out”。
试了几次重启大法,每次都是坚持一会之后,就再次出现 SocketTimeoutException。(注意,在测试环境于遇到问题重启服务,并不是一个好的实践,因为重启可能会让不容易出现的问题现场被破坏。如果问题在测试环境不能再重新,却在发版后出现在生产环境的话,那不仅会造成生产运维事件,还要顶着巨大的压力去解决问题,有过经验的小伙伴一定知道个中滋味。)
2.初步分析
顺着测试汇报的出现问题的场景,跟踪调用链上相关服务的日志,发现出现了微服务之间循依赖调用。大致情况可以抽象如下所示(图中所有调用都是 http 协议):
-
Client 调用服务 Foo.hello()
-
Foo.hello() 逻辑中会调用服务 Boo.boo()
<