文章目錄
- 線程隔離
- 一、滑動窗口算法
- 二、漏桶算法
- 三、令牌桶算法
- 面試題
- 1、Sentinel 限流和Gateway限流的區別
線程隔離
兩種實現方式
線程池隔離(Hystix隔離),每個被隔離的業務都要創建一個獨立的線程池,線程過多會帶來額外的CPU開銷,性能一般,但隔離性更強;
信號量隔離(Sentinel隔離),不用創建線程池,性能較好,但隔離性一般。
服務保護算法
一、滑動窗口算法
固定窗口算法
1、其將時間劃分為多個窗口,窗口時間跨度為Interval;
2、每個窗口分別計數統計,每有一次請求就將計數器+1,限流就是設置計數器閾值;
3、如果計數器超過限流閾值,則超過閾值的請求都被丟棄;
缺點:在特殊情況,在前一間隔中間 和 后一間隔中間,組成完整的間隔。
實現步驟
1、將窗口劃分為n個更小的區間,窗口的時間跨度interval為1秒,區間數量n=2,則每個區間的時間跨度為500ms,每個區間都有計數器;
2、限流閾值依然是3,時間窗口內請求超過閾值時,超出的請求被限流;
3、窗口會根據當前請求所在時間currentTime移動,窗口范圍從currentTime - interval 之后的第一個時區開始,到currentTime所在時區結束。
二、漏桶算法
實現步驟
1、將每個請求視做水滴放入漏桶進行存儲;
2、漏桶以固定速率向外進行漏出請求執行,如果漏桶空了,則停止漏水;
3、如果漏桶滿了,則將多余的水滴進行直接丟棄。
桶的容量取決與限流的QPS閾值和允許等待的最大超時時間。
三、令牌桶算法
實現步驟
1、以固定速率生成令牌,存入令牌桶中,如果令牌桶滿了,則停止生成;
2、請求進入后,必須先嘗試從桶中獲取令牌,獲取到令牌后才可以被處理;
3、如果令牌桶中沒有令牌,則請求等待或丟棄
設置的令牌的速率不能設置為服務器處理的上限
適應場景:熱點參數限流
面試題
1、Sentinel 限流和Gateway限流的區別
Gateway采用基于Redis實現的令牌桶算法
Sentinel 默認限流方式為基于滑動窗口算法,中斷路器基于滑動窗口
限流后可快速失敗和排隊等等待,其中排隊等待是基于漏桶算法
熱點參數限流則是基于令牌桶算法