一.概述
用户的客户端调用API网关的引擎,API网关的引擎调用用户的后端服务,目前都使用的是TCP连接,关于TCP连接,一些超时时间的配置会影响到整个通信过程,配置不合理会导致不同情形的问题,甚至导致故障。本文档站在API网关的角度对API网关的客户端和后端服务做出TCP连接超时时间配置的建议,以便用户更好地使用API网关,避免遇到一些已知的问题。
关于基于HTTP协议的TCP超时时间,常见的有以下几个配置:
连接建立超时时间(ConnectionTimeout)
发送请求超时时间(WriteTimeout)
读取后端服务应答超时时间(ReadTimeout)
针对ConnectionTimeout和WriteTimeout,我们可以根据网络情况配置不同的值,如果是公网通信,一般需要配置大一点,比如ConnectionTimeout和WriteTimeout都配置成10秒,如果是内网通信,则可以配置小一点。
但对于ReadTimeout,需要根据后端服务的处理时间来配置,特别是网关场景,需要配置多个ReadTimeout的时候,需要遵守一定规则。
二.使用API网关的TCP连接超时时间配置原则
下图是用户的客户端在调用API网关时链路视图,链路比较简单,客户端的请求发送给API网关,API网关将客户端的请求转发给用户的后端服务,等用户的后端服务处理完业务逻辑返回应答后,API网关将后端服务的应答返回给用户的客户端。
在这个通信过程中,有两个超时时间的配置是需要特别关注的:
1.在客户端配置的API网关应答超时时间(ClientReadTimeout)
2.在API网关配置的后端服务超时时间(APIGatewayBackendTimeout)
根据上图的图示,我们可以看到:
ClientReadTimeout = T2 + T3 + T4 + T5
APIGatewayBackendTimeout = T2 + T3 + T4
因此我们在配置ClientReadTimeout和APIGatewayBackendTimeout的时候,一定要遵守一个原则:
APIGatewayReaderTimeout需要大于后端业务处理时间
ClientReadTimeout需要大于APIGatewayBackendTimeout
我们举个例子,如果后端服务对于一个API的处理时间绝大部分在10秒以内,那么我们将APIGatewayBackendTimeout设置为10秒,ClientReadTimeout设置为15秒。确保后端应答返回的时候TCP连接没有被关闭。
如果不按照这个原则进行配置,那么在用户后端服务延时较大的情况下,客户端会在API网关返回应答前提前关闭TCP连接,导致API网关在应答的时候找不到可用的TCP连接报N502RE的错误,严重的时候可能会产生雪崩效应。这个配置请务必关注。
三.具体配置
上文说到的ClientReadTimeout需要在客户端的初始化HttpClient连接池的代码中配置,拿API网关提供的SDK举例,在下面代码中配置:
上文说到的APIGatewayBackendTimeout需要在API网关定义API的后端服务的时候配置,如下图所示: