基本介绍
节流,主要目的是减少一段时间内单个客户端对后端请求的次数,降低单个客户端的QPS,减轻服务器压力,为什么叫节流呢,感觉还是比较形象的,比如输入框输入,需要远程搜索的时候,不希望每输入一个字母都触发一次搜索,这时候就需要在输入期间每隔一定时间发一次请求,这就是节流。
节流可以放在触发的地方,也可以统一放在请求的地方,一般来说,有下面几种做法。
- A:封装一个
throttle
工具函数,将触发方法直接丢进去,在throttle
内部定时触发就完事儿 - 在网络请求的地方处理,如果是短时间内的多次请求
- B:取消最后一次之前的请求(cancel request)
- C:定时取消后面的请求,大概与在触发的地方效果差不多
区别
那么,这几种做法有什么区别呢?我们就用输入搜索作为例子来看一下
A:隔一段时间发一次请求,服务器正常响应,结果返回正常更新页面。
B:一直发请求,但是前面的请求会被取消掉,当然,这个服务器如果没有支持取消请求的话,依然是会响应的,只不过客户端取消请求的话,是收不到返回的,也不会相应做页面更新,只会相应最后一次请求更新页面。所以其实这里是假性的节流的。
C:一直发请求,但是会取消掉中间的请求,隔一段响应一次,和B一样,如果服务端不支持取消,则还是会响应。
但是如果要服务端支持取消网络请求,取消请求的请求也可能有延迟,所以不如用websocket,一个普普通通的get请求,何必用到websocket呢。
综上,A最符合节流的目的,B是用户体验最好的,但是只是假节流,所以如果服务器没压力,可以用这种方式,C也是假节流,而且用户体验还差。