歡迎您光臨本站 註冊首頁

Sentinel Go 0.4.0 釋出,支援熱點流量防護能力

←手機掃碼閱讀     admin @ 2020-07-02 , reply:0

Sentinel 是阿里巴巴開源的,面向分散式服務架構的流量控制元件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統自適應保護等多個維度來幫助開發者保障微服務的穩定性。Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、訊息削峰填谷、叢集流量控制、實時熔斷下游不可用服務等,是保障微服務高可用的利器,原生支援 Java/Go/C++ 等多種語言,並且提供 Istio/Envoy/SOFA MOSN 全域性流控支援來為 Service Mesh 提供高可用防護的能力。

近期,Sentinel Go 0.4.0 正式釋出,帶來了熱點引數流控特性,可以自動識別統計傳入引數中的“熱點”引數值並分別進行流控,對於防刷、熱點商品訪問頻次控制等場景非常有用,是高可用流量防護中重要的一環。下面我們來瞭解一下熱點引數流控的場景和原理。

熱點流量防護介紹

流量是隨機的,不可預測的。為了防止被大流量打垮,我們通常會對核心介面配置限流規則,但有的場景下配置普通的流控規則是不夠的。我們來看這樣一種場景——大促峰值的時候,總是會有不少“熱點”商品,這些熱點商品的瞬時訪問量非常高。一般情況下,我們可以事先預測一波熱點商品,並對這些商品資訊進行快取“預熱”,以便在出現大量訪問時可以快速返回而不會都打到 DB 上。但每次大促都會湧現出一些“黑馬”商品,這些“黑馬”商品是我們無法事先預測的,沒有被預熱。當這些“黑馬”商品訪問量激增時,大量的請求會擊穿快取,直接打到 DB 層,導致 DB 訪問緩慢,擠佔正常商品請求的資源池,最後可能會導致系統掛掉。這時候,利用 Sentinel 的熱點引數流量控制能力,自動識別熱點引數並控制每個熱點值的訪問 QPS 或併發量,可以有效地防止過“熱”的引數訪問擠佔正常的呼叫資源。

再比如有的場景下我們希望限制每個使用者呼叫某個 API 的頻率,將 API 名稱+userId 作為埋點資源名顯然是不合適的。這時候我們可以在給 API 埋點的時候透過 WithArgs(xxx) 將 userId 作為引數傳入到 API 埋點中,然後配置熱點規則即可針對每個使用者分別限制呼叫頻率;同時,Sentinel 也支援針對某些具體值單獨配置限流值,進行精細化流控。

熱點引數埋點/規則示例:


 // 埋點示例
 e, b := sentinel.Entry("my-api", sentinel.WithArgs(rand.Uint32()%3000, "sentinel", uuid.New().String()))
 
 // 規則示例
 _, err = hotspot.LoadRules([]*hotspot.Rule{
 	{
 		Resource:          "my-api",
 		MetricType:        hotspot.QPS, // 請求量模式
 		ControlBehavior:   hotspot.Reject,
 		ParamIndex:        0, // 引數索引,0 即為第一個引數
 		Threshold:         50, // 針對每個熱點引數值的閾值
 		BurstCount:        0,
 		DurationInSec:     1, // 統計視窗時長,這裡為 1s
 		SpecificItems: map[hotspot.SpecificValue]int64{
 			// 支援針對某個具體值單獨配置限流值,比如這裡針對數值 9 限制請求量=0(不允許透過)
 			{ValKind: hotspot.KindInt, ValStr: "9"}: 0,
 		},
 	},
 })
 

像其他規則一樣,熱點流控規則同樣支援透過動態資料來源進行動態配置。

Sentinel Go 提供的 RPC 框架整合模組(如 Dubbo、gRPC)均會自動將 RPC 呼叫的引數列表附帶在埋點中,使用者可以直接針對相應的引數位置配置熱點流控規則。目前熱點規則僅支援基本型別和字串型別,後續社群會進一步進行完善,支援更多的型別。

Sentinel Go 的熱點流量控制基於快取淘汰機制+令牌桶機制實現。Sentinel 透過淘汰機制(如 LRU、LFU、ARC 策略等)來識別熱點引數,透過令牌桶機制來控制每個熱點引數的訪問量。目前 0.4.0 版本採用 LRU 策略統計熱點引數,在後續的版本中社群會引入更多的快取淘汰機制來適配不同的場景。

高可用流量防護最佳實踐

在服務提供方(Service Provider)的場景下,我們需要保護服務提供方不被流量洪峰打垮。我們通常根據服務提供方的服務能力進行流量控制,或針對特定的服務呼叫方進行限制。為了保護服務提供方不被激增的流量拖垮影響穩定性,我們可以結合前期的容量評估,透過 Sentinel 配置 QPS 模式的流控規則,當每秒的請求量超過設定的閾值時,會自動拒絕多餘的請求。同時可以結合熱點引數流控進行細粒度的流量防護。

在服務呼叫端(Service Consumer)的場景下,我們需要保護服務呼叫方不被不穩定的依賴服務拖垮。藉助 Sentinel 的訊號量隔離策略(併發數流控規則),限制某個服務呼叫的併發量,防止大量慢呼叫擠佔正常請求的資源;同時,藉助熔斷降級規則,當異常比率或業務慢呼叫比例超過某個閾值後將呼叫自動熔斷,直到一段時間過後再嘗試恢復。熔斷期間我們可以提供預設的處理邏輯(fallback),熔斷期間的呼叫都會返回 fallback 的結果,而不會再去嘗試本已非常不穩定的服務。需要注意的是,即使服務呼叫方引入了熔斷降級機制,我們還是需要在 HTTP 或 RPC 客戶端配置請求超時時間,來做一個兜底的保護。

在一些請求突刺的場景中,比如 MQ 客戶端消費訊息的場景,我們可能不希望將多餘的訊息直接拒絕(重投),而是讓這些過量的訊息排隊逐步處理。這就是“削峰填谷”的場景。我們可以利用 Sentinel 流控規則中的“勻速+排隊等待”控制效果來處理這種場景,以固定的間隔時間讓請求透過,超出預設量的請求排隊等待。這種方式適合用於請求以突刺狀來到,這個時候我們不希望一下子把所有的請求都透過,這樣可能會把系統壓垮;同時我們也期待系統以穩定的速度,逐步處理這些請求,以起到“削峰填谷”的效果,而不是直接拒絕所有多餘的請求。

同時 Sentinel Go 還提供 全域性維度的系統自適應保護能力,結合系統的 Load、CPU 使用率以及服務的入口 QPS、響應時間和併發量等幾個維度的監控指標,透過自適應的流控策略,讓系統的入口流量和系統的負載達到一個平衡,讓系統儘可能跑在最大吞吐量的同時保證系統整體的穩定性。系統規則可以作為整個服務的一個兜底防護策略,保障服務不掛。

Let's start hacking!

Sentinel Go 版本正在快速演進中,我們非常歡迎感興趣的開發者參與貢獻,一起來主導未來版本的演進。Sentinel Go 版本的演進離不開社群的貢獻。若您有意願參與貢獻,歡迎聯絡我們加入 Sentinel 貢獻小組一起成長。我們會定期給活躍貢獻者寄送小禮品,核心貢獻者可以提名為 committer,一起主導社群的演進。同時,也歡迎大家透過 AHAS Sentinel 控制檯 來快速體驗 Sentinel 的能力。Now let's start hacking!

阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”


[admin ]

來源:OsChina
連結:https://www.oschina.net/news/116872/sentinel-go-0-4-0-released
Sentinel Go 0.4.0 釋出,支援熱點流量防護能力已經有58次圍觀

http://coctec.com/news/soft/show-post-240606.html