1. 程式人生 > >扛住阿里雙十一高併發流量,Sentinel是怎麼做到的?

扛住阿里雙十一高併發流量,Sentinel是怎麼做到的?

Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景

本文介紹阿里開源限流熔斷方案Sentinel功能、原理、架構、快速入門以及相關框架比較

基本介紹

1 名詞解釋

  • 服務限流 :當系統資源不夠,不足以應對大量請求,對系統按照預設的規則進行流量限制或功能限制

  • 服務熔斷:當呼叫目標服務的請求和呼叫大量超時或失敗,服務呼叫方為避免造成長時間的阻塞造成影響其他服務,後續對該服務介面的呼叫不再經過進行請求,直接執行本地的預設方法

  • 服務降級:為了保證核心業務在大量請求下能正常執行,根據實際業務情況及流量,對部分服務降低優先順序,有策略的不處理或用簡單的方式處理

服務降級的實現可以基於人工開關降級(秒殺、電商大促等)和自動檢測(超時、失敗次數、故障),熔斷可以理解為一種服務故障降級處理

2 為什麼需要限流降級

系統承載的訪問量是有限的,如果不做流量控制,會導致系統資源佔滿,服務超時,從而所有使用者無法使用,通過服務限流控制請求的量,服務降級省掉非核心業務對系統資源的佔用,最大化利用系統資源,儘可能服務更多使用者

3 Sentinel簡介

Sentinel: 分散式系統的流量防衛兵,是阿里中介軟體團隊2018年7月開源的,面向分散式服務架構的輕量級流量控制產品,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來保護系統服務的穩定性

Sentinel 的開源生態:

功能特性

1 總體介紹

Sentinel 具有以下特徵:

豐富的應用場景:秒殺限流,訊息削峰填谷、叢集流量控制、實時熔斷下游不可用應用等

完備的實時監控:Sentinel 同時提供實時的監控功能。可以在控制檯中看到接入應用的單臺機器秒級資料,甚至 500 臺以下規模的叢集的彙總執行情況

廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組,例如與 Spring Cloud、Dubbo、gRPC 的整合。只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel

完善的 SPI 擴充套件點:Sentinel 提供簡單易用、完善的 SPI 擴充套件介面。可以通過實現擴充套件介面來快速地定製邏輯。例如定製規則管理、適配動態資料來源等

Sentinel 分為兩個部分:

控制檯(Dashboard) 基於 Spring Boot 開發,打包後可以直接執行,不需要額外的 Tomcat 等應用容器

核心庫(Java 客戶端) 不依賴任何框架/庫,能夠運行於所有 Java 執行時環境,同時對 Dubbo / Spring Cloud 等框架也有較好的支援

2 控制檯特性

  • 實時監控
    支援自動發現叢集機器列表、服務健康狀態、服務呼叫通過/拒絕QPS、呼叫耗時、圖表統計

  • 規則管理及推送
    支援在介面配置流控、降級、熱點規則,並實時推送

  • 鑑權
    控制檯支援自定義鑑權介面,提供基本登入功能

3 核心庫功能特性

(1) 應用流控

針對指定應用例項的流量控制,監控應用流量QPS或併發執行緒數,當達到指定的閾值時對流量進行控制,以避免被瞬時的流量高峰沖垮,從而保障應用的高可用性

流量控制的手段包括:

  • 直接拒絕
  • Warm Up,即預熱/冷啟動方式,讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,給冷系統一個預熱的時間,避免冷系統被瞬間壓垮
  • 勻速排隊,嚴格控制請求通過的間隔時間,讓請求以均勻的速度通過

(2) 叢集流控

不同於應用流控根據單個應用例項閾值執行限流檢查,叢集流控只對整個叢集呼叫總量進行限流,例如以下場景:

  • 限制某個使用者呼叫某個API的總QPS,提供API的應用在多個機器上部署了多個例項
  • 因為多個應用例項流量不均勻,導致叢集呼叫總量沒有到的情況下某些機器就開始限流

僅靠單機維度去限制的話會無法精確地限制總體流量,通過叢集精確地控制整個叢集的呼叫總量,結合單機限流兜底,可以更好地發揮流量控制的效果

(3) 閘道器流控

Sentinel 支援對 Spring Cloud Gateway、Zuul 等主流的 API Gateway 進行限流

閘道器流控針對 API閘道器的場景定製的限流規則,可以針對不同 route 或自定義的 API 分組進行限流,支援針對請求中的路徑、引數、Header、來源 IP 等進行定製化的限流

(4) 熔斷降級

如果呼叫鏈路中的某個資源不穩定,最終會導致請求發生堆積,通過熔斷降級能在呼叫鏈路中某個資源出現不穩定狀態時(包括呼叫超時、異常比例升高、異常數升高),對這個資源的呼叫進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤

當資源被降級後,在接下來的降級時間視窗之內,對該資源的呼叫都自動熔斷(預設行為是丟擲 DegradeException),經過時間視窗之後,退出熔斷,並在下一次資源出現不穩定狀態再次自動熔斷

(5) 熱點引數限流

熱點即經常訪問的資料,熱點引數限流會統計傳入引數中的熱點引數,並根據配置的限流閾值與模式,對包含熱點引數的資源呼叫進行限流
例如以下場景:

  • 使用者ID為引數,限制使用者對介面的範圍QPS
  • 商品ID為引數,限制商品下單介面頻率

(6) 系統自適應限流

為了解決傳統方案:基於作業系統負載(load1,linux下用uptime檢視)做進行自適應限流,帶來的存在延時、系統性能恢復慢的問題,Sentinel採用新的思路:根據系統能夠處理的請求,和允許進來的請求,來做平衡,而不是根據一個間接的指標(系統 load)來做限流

目標在於:在系統不被拖垮的情況下,儘可能提高系統的吞吐率,而不是 負載 一定要到低於某個閾值

系統保護規則是從應用級別的入口流量進行控制,從單臺機器的總體 Load、RT、入口 QPS 和執行緒數四個維度監控應用資料,當實際執行達到限定閾值進行限流保護,支援的閾值型別:

  • Load:當系統 load1 超過閾值,且系統當前的併發執行緒數超過系統容量時才會觸發系統保護。系統容量由系統時間執行監測到的的 maxQps * minRt (最小響應時間)計算得出
  • RT:當單臺機器上所有入口流量的平均 RT(響應時間)
  • 執行緒數:當單臺機器上所有入口流量的併發執行緒數
  • 入口 QPS:當單臺機器上所有入口流量的 QPS

(7) 黑白名單控制

Sentinel黑白名單根據資源的請求來源(origin)限制資源是否通過,若配置白名單則只有請求來源位於白名單內時才可通過;若配置黑名單則請求來源位於黑名單時不通過,其餘的請求通過

快速入門

1 安裝控制檯

從github release頁面(https://github.com/alibaba/Sentinel/releases)下載最新控制檯jar包

命令列啟動控制檯:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

2 應用接入Sentinel

Sentinel適配了常見主流框架,包括Dubbo、Spring Boot、Spring WebFlux、gRPC、Zuul、Spring Cloud Gateway、RocketMQ、Web Servlet,對於需要限流的資源,支援用原生Java的try-catch 接入或者使用註解

下面以常見的Spring Boot註解的方式作為示例:
引入sentinel適配Spring Cloud的依賴:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

application.yml指定控制檯地址:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: IP:埠號

定義需要限流的資源:

@RestController
public class TestController {

    @GetMapping(value = "/hello")
    // 定義需要限流的資源名稱為hello
    @SentinelResource("hello")
    public String hello() {
        return "Hello Sentinel";
    }
}

請求一次上面的http hello介面後,觸發Sentinel客戶端初始化,才能在控制檯看到介面

新增流控規則:

頻繁請求介面,可以看到部分請求被拒絕:

注意:上面的配置方式是沒有做持久化的,生產環境不建議使用

3 規則配置

Sentinel 提供 動態規則資料來源 支援來動態地管理、讀取配置的規則。Sentinel 提供的 ReadableDataSource 和 WritableDataSource 介面簡單易用,非常方便使用。

Sentinel 動態規則源針對常見的配置中心和遠端儲存進行適配,目前已支援 Nacos、ZooKeeper、Apollo、Redis 等多種動態規則源,可以覆蓋到很多的生產場景

實現原理

下面介紹Sentinel客戶端基本原理

1 基本概念

  • Resource 資源
    Sentinel中,需要被流量保護的方法、程式碼塊都可以稱為資源,每個資源都需要定義一個唯一的資源名詞,用於匹配相關規則

  • Entry
    Sentinel功能入口類,Entry 可以通過對主流框架的適配自動建立,也可以通過註解的方式或呼叫 SphU API 顯式建立,建立後執行資源和規則匹配和校驗

  • Slot
    功能插槽,由Enty類建立,每個資源對應一系列Slot,Slot實現資源資訊收集、規則匹配、校驗的,多個Slot通過組成Slot Chain,在進入資源和退出資源時分別基於責任鏈模式呼叫entry()和exit()方法

2 工作原理

一個簡單的demo:

String resourceName = "resourceName";
Entry entry = null;
try {
    entry = SphU.entry(resourceName);
    System.out.println("resource running");
} catch (BlockException e) {
    // 限流
    throw e;
} catch (Throwable e) {
    e.printStackTrace();
    throw e;
} finally {
    if (entry != null) {
        entry.exit();
    }
}

主要流程如下:

  • 進入資源方法之前,基於SphU建立Entry,Entry獲取查詢資源關聯的Slot Chain資訊,如果找不到則建立,並基於責任鏈模式呼叫Slot的entry()方法
  • 資源方法呼叫
  • 資源方法呼叫完成後,通過Entry觸發Slot的exit()邏輯

框架比較

Sentinel Hystrix resilience4j
隔離策略 訊號量隔離(併發執行緒數限流) 執行緒池隔離/訊號量隔離 訊號量隔離
熔斷降級策略 基於響應時間、異常比率、異常數 基於異常比率 基於異常比率、響應時間
實時統計實現 滑動視窗(LeapArray) 滑動視窗(基於 RxJava) Ring Bit Buffer
動態規則配置 支援多種資料來源 支援多種資料來源 有限支援
擴充套件性 多個擴充套件點 外掛的形式 介面的形式
基於註解的支援 支援 支援 支援
限流 基於 QPS,支援基於呼叫關係的限流 有限的支援 Rate Limiter
流量整形 支援預熱模式、勻速器模式、預熱排隊模式 不支援 簡單的 Rate Limiter 模式
系統自適應保護 支援 不支援 不支援
控制檯 提供開箱即用的控制檯,可配置規則、檢視秒級監控、機器發現等 簡單的監控檢視 不提供控制檯,可對接其它監控系統

值得補充的是:相比Hystrix基於執行緒池隔離進行限流,這種方案雖然隔離性比較好,但是代價就是執行緒數目太多,執行緒上下文切換的 overhead 比較大,特別是對低延時的呼叫有比較大的影響。

Sentinel 併發執行緒數限流不負責建立和管理執行緒池,而是簡單統計當前請求上下文的執行緒數目,如果超出閾值,新的請求會被立即拒絕,效果類似於訊號量隔離

參考

《Sentinel官方文件》

https://github.com/alibaba/Sentinel/wiki

《從 Hystrix 遷移到 Sentinel》

https://github.com/alibaba/Sentinel/wiki/Guideline:-從-Hystrix-遷移到-Sentinel

相關推薦

阿里雙十一高併發流量Sentinel是怎麼做到的?

Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景 本文介紹阿里開源限流熔斷方案Sentinel功能、原理、架構、快速入門以及相關框架比較 基本介紹 1 名詞解釋 服務限流 :當系統資源不夠,不足以應對大量請求,對系統按照預設的規則進行流量限制或功能限制 服務熔斷:當呼叫目標服務的請

從步履蹣跚到舉重若輕阿里基礎架構如何全球最猛的流量洪峰?

第十個雙11即將來臨之際,阿里技術推出《十年牧碼記》系列,邀請參與歷年雙11備戰的核心技術大牛,一起回顧阿里技術的變遷。 今天,阿里平臺技術事業部資深技術專家叔同,為我們講述基礎架構這十年的演進歷程:從技術追趕期,技術成熟期,再到爆發期,我們不僅支撐了雙11年年攀升的峰值,

雙十一高併發場景背後的資料庫RDS技術揭祕

【戰報】11月11日聚石塔(阿里雲資料庫RDS產品形態)峰值QPS突破X00w,Proxy 峰值QPS超過X00w。 雙十一就要來了,全世界都為其瘋狂,但是在雙十一搶購中經常會出現幾萬人搶一個紅包或者很多人共同購買一個商品的情況,這就引發了一個數據庫比較擔心的場景----高併發。作為歷屆雙十一重要保障之一的

老闆讓你抗千萬級流量如何架構設計?

隨著網際網路的發展,各項軟體的客戶量日益增多,當客戶量達到一定峰值時,當數以萬計的流量來臨時,程式的順利執行以及即時響應則顯得尤為重要,就像雙11那天的淘寶一樣。那麼,如何設計架構才能夠抗住這千萬級的流量。 老闆讓你抗住千萬級流量,如何做架構設計? 首先,要在我們架構設計的時候建立一些原則。

千萬級流量如何架構設計?

隨著網際網路的發展,各項軟體的客戶量日益增多,當客戶量達到一定峰值時,當數以萬計的流量來臨時,程式的順利執行以及即時響應則顯得尤為重要,就像雙11那天的淘寶一樣。那麼,如何設計架構才能夠抗住這千萬級的流量。   老闆讓你抗住千萬級流量,如何做架構設計?   首

阿里雙十一狂歡再度升級巔峰鉅惠·拼你喜歡低至一折

上週阿里雲雙十一剛剛解讀完,域名與智慧財產權專場接踵而至,今天阿里雙十一狂歡再度升級,巔峰鉅惠·拼你喜歡,低至一折。那麼“巔峰鉅惠·拼你喜歡”如何接力阿里雲雙十一活動呢?到底有哪些優惠呢? 阿里雙十一狂歡再度升級,巔峰鉅惠·拼你喜歡,低至一折巔峰鉅惠·拼你喜歡分為四個部分: 巔峰鉅惠·拼你喜歡分為四個部分

2018/10/11 林奇Linkey-完美暴跌跑贏走勢!

昨夜,美股慘遭血洗,堪稱黑色星期三,道指大跌800點,跌幅超3.15%,標普500指數收跌3.29%,納指暴跌4.08%。 美股暴跌波及全球市場,香港恆生指數暴跌超千點,上證指數盤中跌幅超4% 。  對於這次罕見的暴跌,美國總統特朗普也坐不住了,在盤後他表示: “我認為美聯儲在犯錯誤,他們

萬臺伺服器分鐘級部署探祕阿里雙十一彈性擴容背後的技術故事

一、寫在前面 又是一年雙十一,這次的購物狂歡再次重新整理記錄,而背後的阿里雲技術也再次交上了一份不錯的‘期末考卷’。 往往在大促等高峰時段都需要對流量提前預估,但實際上預先計算好的資源和應用容量,依然可能不足以支撐流量高峰,需要緊急擴容;而容器技術則非常適合這種場景,在需要時快速地、自動彈性伸縮。那麼在業

阿里面試系列」搞懂併發程式設計輕鬆應對80%的面試場景

關注我的架構技術公眾號:“架構師修煉寶典”一週出產1-2篇技術文章,希望在你的架構技術路上有我的點滴陪伴! 作為一個合格的Java程式設計師,必須要對併發程式設計有一個深層次的瞭解,在很多網際網路企業都會重點考察這一塊。可能很多工作3年以上的Java程式設計師對於這一領域幾乎沒有太多研究。所以在接

阿里雲檔案儲存(NAS)助力業務系統承載雙十一尖峰流量

2018天貓雙11全球狂歡節,全天成交額再次重新整理紀錄達到2135億元,其中總成交額在開場後僅僅用了2分05秒即突破100億元,峰值的交易量達到驚人的高度,背後離不開阿里雲大資料計算和儲存能力的支撐。在整個交易的鏈路上,賬單業務是一個重要的環節,尤其對商家系統來說,需要定期對賬,賬單子系統出現一點點問題都會

為迎接雙十阿里員工開始熬夜加班看到“夜宵”才瞭解真相!

米鼠資訊:對於很多喜歡網購的人來說,雙十一是一個很重要的日子,因為在雙十一這一天,很多東西都會很搞優惠,所以經常網購的人自然是不會錯過這樣的一個機會的,不過這個時候阿里的員工可就忙壞了,因為他們要連夜的加班。 之所以熬夜加班,也算是為迎接雙十一做準備,因為對於

8秒破億銷量這家家電商城如何抗雙11的頂級流量

11月11日零點,某大型電器公司電商平臺上演了一場速度與激情的年度大戲,在一片歡呼聲中,該電商平臺在雙11活動再創佳績,全渠道銷售額8秒破億! 我司實施團隊為該大型電器公司電商平臺搭建的容器PaaS雲平臺,其庫存中心繫統已正式生產上線應用,並且在“雙11”期間平穩完成了

今年阿里雙十一CDN要衝歷史之最峰值頻寬達到5000G+來高手分析一下他們的CDN節點數量和規模

使用各種網路分析工具(http://speed.mmtrix.com)分析工具分析阿里CDN域名*.alicdn.com,得到以下分佈資訊。 電信:上海、西安、瀋陽、蘭州、武漢、南充、北京、東莞、烏魯木齊、衡陽、嘉興、天津、南昌、溫州、福州、阜陽 聯通:杭州、天津

阿里雙十一大促技術準備只了這兩件事情?

雙十一的技術準備在做兩件事情:第一是系統的準備儘可能的接近真實,包括容量確定性和資源的確定性;第二是整個過程中的效率,包括人和單位資源效率。僅憑這兩件事情,就能撐起這場大促嗎? 本文整理自蔣江偉在ArchSummit 2016 北京站上的演講。 後臺回覆關鍵詞「雙十一」,下載本文完整PPT。 親歷雙十

十分鐘萬臺伺服器部署能力探祕阿里雙十一彈性擴容背後的技術故事

往往在大促等高峰時段都需要對流量提前預估,但實際上預先計算好的資源和應用容量,依然可能不足以支撐流量高峰,需要緊急擴容;而容器技術則非常適合這種場景,在需要時快速地、自動彈性伸縮。那麼在業務需求極速上升的情況下,大量伺服器資源啟動時如何抗住併發部署的壓力呢? 在本次雙

過618全部流量京東15萬Docker叢集如何煉成

記者:魏偉([email protected]) 編輯:周建丁([email protected]) 從1萬Docker到15萬,從試水部分應用到承擔全部流量,京東彈性雲團隊用了1年的時間,為2016年618大考交上了新的答卷。D

面試官:十問泛型你能嗎?

問題一:為什麼需要泛型? 答: 使用泛型機制編寫的程式碼要比那些雜亂的使用Object變數,然後再進行強制型別轉換的程式碼具有更好的安全性和可讀性,也就是說使用泛型機制編寫的程式碼可以被很多不同型別的物件所重用。 問題二:從ArrayList的角度說一下為什麼要用泛型? 答: 在Java增加泛型機制之前就已

架構設計 | 高併發流量削峰共享資源加鎖機制

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent) || [GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent) # 一、高併發簡介 在網際網路的業

go-zero 如何流量衝擊(一)

不管是在單體服務中還是在微服務中,開發者為前端提供的API介面都是有訪問上限的,當訪問頻率或者併發量超過其承受範圍時候,我們就必須考慮限流來保證介面的可用性或者降級可用性。即介面也需要安裝上保險絲,以防止非預期的請求對系統壓力過大而引起的系統癱瘓。 `go-zero` 集成了開箱即用的 **限流器** 。其