阿里巴巴sentinel限流
sentinel是什么
- 隨著微服務的流行,服務和服務之間的穩定性變得越來越重要,sentinel以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性
sentinel具有以下特性:
1.豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等
2.完備的實時監控:sentinel同時提供實時的監控功能,可以在控制臺中看到單臺機器秒級數據,甚至500臺以下規模的集群的匯總運行情況
3.廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴并進行簡單的配置即可快速地接入 Sentinel
4.完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定制邏輯。例如定制規則管理、適配動態數據源等
?
sentinel分為兩個部分:
- 核心庫(java客戶端):不依賴任何框架,能夠運行于所有java運行時環境,同時對dubbo、springCloud等框架也有較好的支持
- 控制臺(Dashboard):基于 Spring Boot 開發,打包后可以直接運行,不需要額外的 Tomcat 等應用容器
熔斷降級
- 由于調用關系的復雜性,如果調用鏈路中的某個資源出現了不穩定,最終會導致請求發生堆積
- 當調用鏈路中某個資源出現不穩定,例如,表現為 timeout,異常比例升高的時候,則對這個資源的調用進行限制,并讓請求快速失敗,避免影響到其它的資源,最終產生雪崩的效果
- 通過并發線程數進行限制
Sentinel 通過限制資源并發線程的數量,來減少不穩定資源對其它資源的影響,當某個資源出現不穩定的情況下,例如響應時間變長,對資源的直接影響就是會造成線程數的逐步堆積。當線程數在特定資源上堆積到一定的數量之后,對該資源的新請求就會被拒絕。堆積的線程完成任務后才開始繼續接收請求
- 通過響應時間對資源進行降級?
Sentinel 還可以通過響應時間來快速降級不穩定的資源。當依賴的資源出現響應時間過長后,所有對該資源的訪問都會被直接拒絕,直到過了指定的時間窗口之后才重新恢復
流量控制-QPS 或并發線程數
- 其原理是監控應用流量的 QPS 或并發線程數等指標,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性
防止雪崩,是系統防護中重要的一環。當系統負載較高的時候,如果還持續讓請求進入,可能會導致系統崩潰,無法響應。在集群環境下,網絡負載均衡會把本應這臺機器承載的流量轉發到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀態的時候,這個增加的流量就會導致這臺機器也崩潰,最后導致整個集群不可用。
針對這個情況,Sentinel 提供了對應的保護機制,讓系統的入口流量和系統的負載達到一個平衡,保證系統在能力范圍之內處理最多的請求
- 一條限流規則主要由下面幾個因素組成,我們可以組合這些元素來實現不同的限流效果
resource:資源名,即限流規則的作用對象
count: 限流閾值
grade: 限流閾值類型(QPS 或并發線程數),流量控制主要有兩種統計類型,一種是統計并發線程數,另外一種則是統計 QPS
limitApp: 流控針對的調用來源,若為 default 則不區分調用來源
strategy: 調用關系限流策略
controlBehavior: 流量控制效果(直接拒絕、Warm Up、勻速排隊),注意:若使用除了直接拒絕之外的流量控制效果,則調用關系限流策略(strategy)會被忽略
- 并發線程控制
并發數控制用于保護業務線程池不被慢調用耗盡。例如,當應用所依賴的下游應用由于某種原因導致服務不穩定、響應延遲增加,對于調用者來說,意味著吞吐量下降和更多的線程數占用,極端情況下甚至導致線程池耗盡。為應對太多線程占用的情況,業內有使用隔離的方案,比如通過不同業務邏輯使用不同線程池來隔離業務自身之間的資源爭搶(線程池隔離)。這種隔離方案雖然隔離性比較好,但是代價就是線程數目太多,線程上下文切換的 overhead 比較大,特別是對低延時的調用有比較大的影響。Sentinel 并發控制不負責創建和管理線程池,而是簡單統計當前請求上下文的線程數目(正在執行的調用數目),如果超出閾值,新的請求會被立即拒絕,效果類似于信號量隔離
- QPS流量限制
當 QPS 超過某個閾值的時候,則采取措施進行流量控制。流量控制的效果包括以下幾種:直接拒絕、Warm Up、勻速排隊。對應 FlowRule 中的 controlBehavior 字段
直接拒絕:默認的流量控制方式,當QPS超過任意規則的閾值后,新的請求就會被立即拒絕,拒絕方式為拋出FlowException
Warm up:當流量突然增大的時候,我們常常會希望系統從空閑狀態到繁忙狀態的切換的時間長一些。即如果系統在此之前長期處于空閑的狀態,我們希望處理請求的數量是緩步的增多,經過預期的時間以后,到達系統處理請求個數的最大值。Warm Up(冷啟動,預熱)模式就是為了實現這個目的的
勻速排隊:嚴格控制請求通過的間隔時間,也即是讓請求以均勻的速度通過,對應的是漏桶算法,這種方式主要用于處理間隔性突發的流量,例如消息隊列。想象一下這樣的場景,在某一秒有大量的請求到來,而接下來的幾秒則處于空閑狀態,我們希望系統能夠在接下來的空閑期間逐漸處理這些請求,而不是在第一秒直接拒絕多余的請求
流量控制-基于調用關系的流量控制
流控規則中的 limitApp 字段用于根據調用來源進行流量控制。該字段的值有以下三種選項,分別對應不同的場景
default:表示不區分調用者,來自任何調用者的請求都將進行限流統計。如果這個資源名的調用總和超過了這條規則定義的閾值,則觸發限流
some_origin_name:表示針對特定的調用者,只有來自這個調用者的請求才會進行流量控制
other:表示針對除 {some_origin_name} 以外的其余調用方的流量進行流量控制
同一個資源名可以配置多條規則,規則的生效順序為:{some_origin_name} > other > default
?
總結
以上是生活随笔為你收集整理的阿里巴巴sentinel限流的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汉字转为16进制的unicode
- 下一篇: 随笔小记