知识卡片
超时时间设置过长,会把短暂的网络抖动放大成服务错误
内容
网络抖动时出现大量502错误的真实故障,根源被定位到一个容易被忽视的配置细节:Twemproxy的超时时间被设置为5秒,而且没有针对连接、读、写这三个不同阶段分别设置超时——这意味着一次短暂的网络抖动,可能让整个请求链路白白多等待接近5秒才最终失败,而不是快速失败、及时降级。团队的修复方式是大幅缩短超时时间,内网场景下设置在150毫秒以内,并且对读服务明确了一条原则:一旦超时就应该直接触发降级(比如访问动态服务作为兜底),而不是让调用方傻等。这个案例反映了一条在分布式系统里容易被低估的教训:超时时间设置得过于宽松,看似是”给系统更多容错空间”,实际效果恰恰相反——它会让原本只需要几十毫秒就能感知到并快速降级的短暂抖动,被拖长成秒级的等待,进而在高并发场景下引发线程池耗尽、请求堆积、连锁雪崩这类更严重的次生问题;而内网环境下服务间调用本身的正常延迟通常在几十毫秒量级,超时阈值理应贴近这个正常延迟设置,一旦超过就该判定为异常并快速失败,把宝贵的等待时间省下来用于降级和重试,而不是把超时阈值设得远超正常延迟、指望”多等等说不定就好了”。
参考来源
- 位置:《高可用架构(第1卷)》第3章《电商架构热点专题》"3.1 亿级商品详情页架构演进技术解密"节,"3.1.3 遇到的一些问题和解决方案"(源文件:_epub-src/OEBPS/Text/Chapter3_1_4.xhtml)
- 结论依据:原文说明"Twemproxy配置的timeout时间太长,之前设置为5s,而且没有分别针对连接、读、写设置超时。后来我们减少超时时间,内网设置在150ms以内,当超时时访问动态服务。对于读服务的话,应该设置合理的超时时间,比如超时了直接降级",直接支撑本卡片结论。
- 原始内容:Twemproxy配置的timeout时间太长,之前设置为5s,而且没有分别针对连接、读、写设置超时。后来我们减少超时时间,内网设置在150ms以内,当超时时访问动态服务。对于读服务的话,应该设置合理的超时时间,比如超时了直接降级。