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