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