Troubleshooting系列-一次基于okhttp外部接口调用超时问题分析

💡 原文中文,约4400字,阅读约需11分钟。
📝

内容提要

最近在将一部分事务从服务A移到服务B时,发现服务B的http接口超时比例比服务A高很多。经过代码分析和网络布置差异性的排查,发现问题是由于服务B的http超时时间设置较短导致的。通过修改连接池参数和调整http调用方式,问题得到解决。

🔎

延伸解读

超时设置不一致的陷阱

文章指出,使用Future控制超时时间时,若Future超时时间小于HTTP客户端的连接和读取超时时间,会导致Future先超时返回失败,但后台HTTP请求仍在执行。这种不一致可能造成资源浪费和超时率虚高。开发者应确保超时设置协调,或直接使用HTTP客户端的超时机制。

连接池参数对性能的影响

服务B调用量低,但连接池maxIdleConnections设置过大(512),导致连接难以复用,每次请求都可能新建连接,增加超时风险。将maxIdleConnections调小并延长keepAliveDuration后,第二次请求时间从1133ms降至250ms,表明合理配置连接池能有效提升性能。

排查超时问题的思路

面对超时率差异,作者先分析代码,再排查网络布置,最后结合日志和调用量定位到连接池问题。这种从代码到环境再到数据的逐步排查方法,值得借鉴。尤其注意,相同代码在不同调用量下可能表现迥异,需结合实际情况分析。

❓

Q&A

服务B的HTTP接口超时率是多少?

服务B的HTTP接口超时率为10%。

导致服务B超时率高的原因是什么?

服务B的HTTP超时时间设置较短,导致超时现象频繁发生。

如何解决服务B的超时问题?

通过调整ConnectionPool参数、直接HTTP调用和适当增加超时时间来解决超时问题。

服务A和服务B的网络环境有什么不同?

服务A和服务B的网络环境相同,没有发现网络布置差异性。

修改ConnectionPool参数后有什么效果?

修改ConnectionPool参数后,第二次请求时间显著下降,表明连接复用有效。

使用Future控制超时时间的方式有什么问题?

使用Future控制超时时间的方式不当,导致超时设置不一致。

🏷️

标签

➡️

继续阅读