基于okhttp3拦截器实现短时间内重复请求的拦截

基于okhttp3拦截器实现短时间内重复请求的拦截

API

背景

某次需求代码实现存在缺陷, 导致用户在点击某标签的时候发起了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(
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值