限流的必要性
如果一段時間內請求的數量過大,就會給服務器造成很大壓力,可能導致服務器無法提供其它服務。
計數器算法
通過一個計數器 counter 來統計一段時間內請求的數量,并且在指定的時間之后重置計數器。
該方法實現簡單,但是有臨界問題。例如,允許一分鐘內通過的請求數為 N,如果在重置計數器的前后一小段時間內分別請求 N 次,那么在這一小段時間內總共請求了 2N 次,超出了規定的 N 次。
滑動窗口算法
是計數器算法的一種改進,將原來的一個時間窗口劃分成多個時間窗口,并且不斷向右滑動該窗口。
在臨界位置的突發請求都會被算到時間窗口內,因此可以解決計數器算法的臨界問題。
漏桶算法
能夠以恒定速率處理請求。
請求需要先放入緩存中,當緩存滿了時,請求會被丟棄。
令牌桶算法
和漏桶算法的區別在于它是以恒定速率添加令牌,當一個請求到來時,先從令牌桶取出一個令牌,如果能取到令牌那么就可以處理該請求。
令牌桶的大小有限,超過一定的令牌之后再添加進來的令牌會被丟棄。
令牌桶算法允許突發請求,因為令牌桶存放了很多令牌,那么大量的突發請求會被執行。但是它不會出現臨界問題,在令牌用完之后,令牌是以一個恒定的速率添加到令牌桶中的,因此不能再次發送大量突發請求。
- Leaky Bucket & Tocken Bucket - Traffic shaping