互聯(lián)網(wǎng)大廠面試:如何利用Redis實現(xiàn)全局接口限流
前言
對于某些特殊的業(yè)務(wù)場景,比如搶單、秒殺等業(yè)務(wù),會導(dǎo)致服務(wù)流量瞬間飆升,我們雖然可以通過部署集群的方式分散請求壓力,但是仍然可能造成很大的請求延遲。
這時,我們可以通過接口限流的方式來保證系統(tǒng)的穩(wěn)定運行。
實現(xiàn)邏輯
我們可以通過filter對所有的接口進行攔截,判斷這個接口在當(dāng)前時間窗口內(nèi)的請求次數(shù),如果超出我們設(shè)定的請求上限,就返回?zé)o效請求。
以限制每個接口最大為10個QPS為例,可以有兩種實現(xiàn)邏輯:
其一,將這10個請求進行拆分,相當(dāng)于每100ms可以請求一次。
其二,每秒內(nèi)最多請求10次,而不判斷其請求分布范圍。
兩種邏輯的實現(xiàn)也略有差異。
實現(xiàn)一
每秒請求一次。
實現(xiàn)二
每秒請求N次。
判斷每秒請求N次會比每秒一次稍微復(fù)雜一點,主要是需要判斷當(dāng)前秒內(nèi)已經(jīng)請求了多少次。
這里利用redis的increment和expire配合使用達到限流的目的。
以限制每秒5次為例:
總結(jié)
以上兩種利用redis實現(xiàn)限流的方式基本能滿足我們大部分的業(yè)務(wù)需要,對于部分要求限流粒度更高更準(zhǔn)的業(yè)務(wù),可以引入sentinel來滿足業(yè)務(wù)需要。