Android客户端通过Retrofit2对接ASP.NET Core Rest API偶发响应过慢咨询
问题排查方案
客户端侧排查(优先级最高,Postman测试已排除服务端核心业务逻辑耗时问题)
- 核查OkHttp连接池与服务端保活时长匹配性:Retrofit默认依赖OkHttp的连接池实现TCP连接复用,OkHttp默认连接保活时长为5分钟,若ASP.NET Core侧Kestrel的
KeepAliveTimeout配置短于该值,会出现客户端仍认为连接存活、但服务端已主动断开连接的情况,下一次请求触发TCP重连就会产生数秒的额外耗时。可给OkHttp添加日志拦截器,确认慢请求是否对应CONNECT阶段的耗时上涨。 - 检查Android系统网络限制:多数国产ROM的省电策略会在APP退后台1分钟左右降低非白名单APP的网络优先级,甚至临时冻结网络请求,可在系统开发者选项中开启网络调试日志,确认慢请求发生时APP的网络权限、当前网络类型是否发生切换。
- 校验请求排队情况:OkHttp默认全局最大并发请求数为64、单域名最大并发请求数为5,若同一时间有大量同域名请求发起,后续请求会进入等待队列导致耗时上涨,可在慢请求发生时打印OkHttp分发器的等待队列长度确认是否存在排队。
- 快速验证方案:直接禁用OkHttp连接复用,测试慢请求是否复现,配置代码如下:
// Kotlin 配置示例 val okHttpClient = OkHttpClient.Builder() .connectionPool(ConnectionPool(0, 1, TimeUnit.NANOSECONDS)) .build()
// Java 配置示例 OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectionPool(new ConnectionPool(0, 1, TimeUnit.NANOSECONDS)) .build();
若禁用连接复用后慢请求消失,即可确认是两端连接保活时长不匹配导致的问题。
服务端侧补充排查
- 核对Kestrel保活配置:默认ASP.NET Core Kestrel的
KeepAliveTimeout为2分钟,若客户端刚好间隔1分钟发起请求,可能刚好踩在服务端主动断开连接的临界点,可将Kestrel的保活时长调整为略长于OkHttp的5分钟默认值,两边对齐配置即可解决连接断开导致的重连耗时。 - 排查TCP层日志:不要仅统计业务接口响应耗时,需要记录每个请求的TCP连接是否为新建连接,确认慢请求是否全部对应新建连接的场景。
- 核查限流策略:若服务端配置了按IP的滑动窗口限流,Postman测试的请求频率与客户端实际请求频率不一致时,可能出现客户端触发限流排队、Postman测试不会触发的情况,可检查限流中间件的日志确认是否有限流触发记录。
内容的提问来源于stack exchange,提问作者Udi Azulay
相关产品推荐
相关产品推荐

