基于okhttp3拦截器实现短时间内重复请求的拦截
背景
某次需求代码实现存在缺陷, 导致用户在点击某标签的时候发起了2次请求(即一次重复请求)。由于开发自测阶段没有盯着抓包软件看请求次数, 测试也没有关注接口请求次数问题, 最终将问题带上线。
影响面
- 导致被调用的接口QPS翻倍, 造成服务端压力。
- 接口请求处相关埋点上报数翻倍, 造成数据统计混乱。
解决方案
临时止血
热修复 or 发布小版本修复
最终解决方案
客户端增加短时间重复请求拦截器(Interceptor), 仅在开发阶段(测试包)开启。提前保留问题, 将问题扼杀在开发周期早期。
**拦截器代码: **
/*** 用于拦截200ms内重复请求*/
class DuplicateRequestInterceptor : Interceptor {override fun intercept(chain: Interceptor.Chain): Response {val url = chain.request().url.toString() // 请求urlval time = System.currentTimeMillis() // 请求时间try {synchronized(requestMap) {val value = requestMap[url]// 这里拦截逻辑很粗, 只判断了url, 可以考虑更加精细化地判断各个接口参数、header等if (value != null) {val now = System.currentTimeMillis()val delta = now - valuethrottleOccurred(url, delta)chain.call(