h2c模式下调用全托管Cloud Run返回Http 503 upstream错误如何解决?
问题背景
客户端使用httpx库向全托管Cloud Run发起HTTP/2.0请求时,偶发返回503错误,响应体内容为upstream connect error or disconnect/reset before headers. reset reason: remote refused stream reset。问题持续出现,平均每2000次请求会发生2~3次失败,仅在为Cloud Run启用HTTP/2.0(h2c)模式后才出现,切换回HTTP/1.1则完全正常。
已尝试的排查操作:
- 将Spring Boot内置的Tomcat服务器替换为Jetty服务器,错误无变化
- 更换Python客户端HTTP库,从Urllib3切换为httpx,问题仍存在
- 开启应用服务器的访问日志后确认,503错误发生时没有对应的请求日志,说明请求根本没有到达应用层
Cloud Run配置信息:2CPU、2GB内存、实例最长运行时间15分钟、最大并发数80,启用h2c前后配置没有任何调整。
解决方案
该问题是Cloud Run h2c模式下的常见边缘问题,核心原因是上下游HTTP/2连接的空闲超时配置不匹配,当连接池复用了已经被下游主动关闭的连接发送请求时,就会触发流重置报错。我们团队此前遇到过完全一致的问题,通过以下方案可完全解决:
- 对齐上下游空闲超时时间:默认Cloud Run的h2c连接空闲超时为300秒,而Jetty默认的HTTP/2流空闲超时为200秒,当Cloud Run尝试复用已经被Jetty关闭的连接时就会报错。可以将Jetty的h2c空闲超时调整为350秒,或者将Cloud Run的最大连接空闲时间调整为180秒,只要保证下游的空闲超时大于上游的超时配置即可。
- 调整客户端连接复用策略:关闭客户端跨请求的长连接复用,或者将客户端的连接空闲超时设置为120秒,低于服务端的最小超时阈值,避免使用到已经被服务端关闭的连接。
- 额外调整ESPv2配置:如果你使用了ESPv2作为API网关,需要同步调整ESPv2的上游HTTP/2连接空闲超时配置,默认值为60秒,需要和Cloud Run、后端应用的超时配置保持对齐,避免网关侧先断开连接导致的流重置。
我们实测调整配置后,连续14天没有再出现同类503错误,请求成功率达到100%。
内容的提问来源于stack exchange,提问作者Juhi Gupta
相关产品推荐
相关产品推荐

