流控降級組件 Sentinel Go 0.4.0 發布,支持熱點流量防護能力

2021-01-11 開源中國

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 貢獻小組一起成長(Sentinel 開源討論釘釘群:30150716)。我們會定期給活躍貢獻者寄送小禮品,核心貢獻者可以提名為 committer,一起主導社區的演進。同時,也歡迎大家通過 AHAS Sentinel 控制臺 來快速體驗 Sentinel 的能力。Now let's start hacking!

相關焦點

  • Sentinel Go 0.4.0 發布,支持熱點流量防護能力
    Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、集群流量控制、實時熔斷下遊不可用服務等,是保障微服務高可用的利器,原生支持 Java/Go/C++ 等多種語言,並且提供 Istio/Envoy/SOFA MOSN 全局流控支持來為 Service Mesh 提供高可用防護的能力。
  • Sentinel Go 1.0.1 發布,雲原生流控降級組件
    Sentinel Go 1.0.1 版本正式發布,針對 1.0 GA 版本進行了一些功能改進和 bug fix。
  • 阿里雙11流控降級組件Sentinel Go正式GA,助力雲原生服務穩穩穩
    今年年初,Sentinel 社區宣布了 Sentinel Go 版本的發布,為 Go 語言的微服務和基礎組件提供高可用防護和容錯能力的原生支持,標誌著 Sentinel 朝著多元化與雲原生邁出了新的一步。
  • Sentinel Go 0.3.0 發布,支持熔斷降級能力
    Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、集群流量控制、實時熔斷下遊不可用服務等,是保障微服務高可用的利器,原生支持 Java/Go/C++ 等多種語言,並且提供 Istio/Envoy 全局流控支持來為 Service Mesh 提供高可用防護的能力。
  • Sentinel Go 0.6.0 發布,支持 Warm-Up 預熱流控
    Sentinel Go 0.6.0 正式發布,該版本帶來了 Warm-Up 預熱流控特性、go-micro 框架的適配模塊,以及其它的一些特性改進
  • Sentinel 1.7.0 發布,支持 Envoy 集群流量控制
    流控降級中間件 Sentinel 1.7.0 版本正式發布,引入了 Envoy 集群流量控制支持、properties 文件配置、Consul/Etcd/Spring Cloud Config
  • Sentinel 1.5.0 正式發布,引入 Reactive 支持
    流控降級組件 Sentinel 的又一個裡程碑版本 1.5.0 正式發布,引入了 reactive 的支持,並提供多項新特性與改進。
  • 阿里中間件開源組件 Sentinel 發布首個官方推薦可生產版本
    近日,阿里中間件開源組件Sentinel 發布首個官方推薦可生產版本:1.3.0-GA ,該版本包括 Sentinel 控制臺功能的完善和一些
  • Sentinel 發布 v1.4,添加集群流控功能
    自去年10月底發布GA版本後,Sentinel在近期發布了另一個裡程碑版本v1.4(最新的版本號是v1.4.1),加入了開發者關注的集群流控功能。一、為什麼需要集群流控功能?
  • Sentinel 1.6.3 正式發布,引入網關流控控制臺的支持
    Sentinel 1.6.3 正式發布,引入網關流控控制臺的支持,同時帶來一些 bug 修復和功能改進,歡迎使用!
  • 邁向雲原生,Sentinel Golang 首個版本發布
    Sentinel 是阿里巴巴開源的,面向分布式服務架構的流量控制組件,主要以流量為切入點,從限流、流量整形、熔斷降級、系統自適應保護等多個維度來幫助開發者保障微服務的穩定性。Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺、冷啟動、消息削峰填谷、集群流量控制、實時熔斷下遊不可用服務等,是保障微服務高可用的利器。
  • Sentinel Dashboard(基於1.8.1)流控規則持久化到Nacos——涉及...
    那麼就會出現很嚴重的問題(流控規則達不到預期,配置數據不一致),所以推薦使用Sentinel Dashboard統一界面進行配置管理流控規則正因為Sentinel Dashboard當前版本(截至目前為止是1.8.1-SNAPSHOT)暫不支持,但是可以通過改造部分源碼實現此功能,具體請看下面介紹。
  • 基於Sentinel的高可用限流系統設計及實現完整版
    二、架構設計設計原則:1)高可用2)高可擴展3)高性能4)支持高並發三、具體實現1、sentinel-dashboard的修改1)修改Metric的存儲將Metric數據由默認存儲到內存中,修改為存儲到外部Influxdb集群中,Influxdb集群理論上支持任意多個Influxdb實例,sentinel-dashboard
  • Sentinel V1.7.0 已發布
    在這個版本中,Sentinel使用Sentinel令牌伺服器提供了一個Sentinel全局RLS的實現,使得Sentinel的分布式流量控制能力可以充分發揮。詳情請看這裡。
  • pacebox-springboot 2020.0.0.0 發布,java 生態框架
    pacebox-springboot 融合封裝已發布,旨在提供快速開發腳手架、打造更好的開源生態環境。希望有志同道合的朋友一起維護該軟體、打造一款快速應用開發級生態框架。
  • Sentinel 1.7.2 發布,完善開源生態及擴展性
    Sentinel 1.7.2 正式發布,帶來了 Logger SPI 擴展機制、Zuul 2.x 網關流控、SOFARPC 適配等多項特性和改進。
  • SpringBlade 2.0 正式版發布,集成Nacos與Sentinel
    經過一個半月的持續迭代,SpringBlade2.0的正式版終於發布了,同時全新官網上線。下面我們來看一下正式版有哪些驚喜。集成 SpringCloud Alibaba Sentinel,從流量控制、熔斷降級、系統負載等多個維度保護服務的穩定性。Sentinel Dashboard 鏡像推送至DockerHub,開發調試可用docker啟動,更加方便。
  • Polymer 1.0.0 發布,Web 組件構建框架
    Polymer 1.0.0 發布,自從 0.5 開發者預覽版發布以後,Polymer 主要關注跨瀏覽器性能,對開發者更友好。
  • pacebox-springboot 1.0.9 發布,Java 生態框架
    pacebox-springboot 融合封裝已發布,旨在提供快速開發腳手架、打造更好的開源生態環境。希望有志同道合的朋友一起維護該軟體、打造一款快速應用開發級生態框架。
  • J2Cache 2.7.0 發布了,支持 Lettuce 替代 Jedis
    J2Cache 2.7.0 在周末悄沒聲息的發布了!!!