基本介紹
節(jié)流饥悴,主要目的是減少一段時間內(nèi)單個客戶端對后端請求的次數(shù)坦喘,降低單個客戶端的QPS盲再,減輕服務(wù)器壓力,為什么叫節(jié)流呢瓣铣,感覺還是比較形象的答朋,比如輸入框輸入,需要遠(yuǎn)程搜索的時候棠笑,不希望每輸入一個字母都觸發(fā)一次搜索梦碗,這時候就需要在輸入期間每隔一定時間發(fā)一次請求,這就是節(jié)流腐晾。
節(jié)流可以放在觸發(fā)的地方叉弦,也可以統(tǒng)一放在請求的地方,一般來說藻糖,有下面幾種做法淹冰。
- A:封裝一個
throttle
工具函數(shù),將觸發(fā)方法直接丟進(jìn)去巨柒,在throttle
內(nèi)部定時觸發(fā)就完事兒 - 在網(wǎng)絡(luò)請求的地方處理樱拴,如果是短時間內(nèi)的多次請求
- B:取消最后一次之前的請求(cancel request)
- C:定時取消后面的請求,大概與在觸發(fā)的地方效果差不多
區(qū)別
那么洋满,這幾種做法有什么區(qū)別呢晶乔?我們就用輸入搜索作為例子來看一下
A:隔一段時間發(fā)一次請求,服務(wù)器正常響應(yīng)牺勾,結(jié)果返回正常更新頁面正罢。
B:一直發(fā)請求,但是前面的請求會被取消掉驻民,當(dāng)然翻具,這個服務(wù)器如果沒有支持取消請求的話,依然是會響應(yīng)的回还,只不過客戶端取消請求的話裆泳,是收不到返回的,也不會相應(yīng)做頁面更新柠硕,只會相應(yīng)最后一次請求更新頁面工禾。所以其實這里是假性的節(jié)流的。
C:一直發(fā)請求蝗柔,但是會取消掉中間的請求闻葵,隔一段響應(yīng)一次,和B一樣癣丧,如果服務(wù)端不支持取消槽畔,則還是會響應(yīng)。
但是如果要服務(wù)端支持取消網(wǎng)絡(luò)請求坎缭,取消請求的請求也可能有延遲竟痰,所以不如用websocket,一個普普通通的get請求掏呼,何必用到websocket呢坏快。
綜上,A最符合節(jié)流的目的憎夷,B是用戶體驗最好的莽鸿,但是只是假節(jié)流,所以如果服務(wù)器沒壓力拾给,可以用這種方式祥得,C也是假節(jié)流,而且用戶體驗還差蒋得。