知识卡片

三种超时各守一段链路

专业/工作 · 524.c

内容

一次远程调用的完整链路上至少有三段可能卡住的地方,各自需要独立配置超时:连接超时管的是”和对方建立通信通道要花多久”;连接池超时管的是”从连接池里拿到一个可用连接要等多久”(池子里的连接可能都被占用了);读超时管的是”连接建立好之后,等对方把响应数据发完要花多久”。这三段互不重叠,任何一段不设上限都可能让调用方无限期挂起,进而在同步阻塞模型下拖垮整个线程池。发散:把超时拆成这三段而不是笼统设一个”总超时”,是因为每一段卡住的原因完全不同、修复手段也不同——连接超时卡住说明网络或对方服务本身有问题,连接池超时卡住说明并发量超过了池子容量,读超时卡住说明对方处理慢,混在一起报同一个”请求超时”错误,排查时根本无从下手该往哪个方向查。

参考来源

《Cloud Native Spring in Action》第8章《Reactive Spring: Resilience and scalability》