主頁 > 軟體工程 > 4種典型限流實踐保障應用高可用|云效工程師指北

4種典型限流實踐保障應用高可用|云效工程師指北

2022-03-25 07:53:09 軟體工程

大家好,我叫黃博文,花名延枚,目前負責云效旗下產品Flow流水線的設計和開發,在微服務架構下,服務越來越多,服務之間的呼叫也會越來越復雜,如何保障服務的高可用性就成為了一個挑戰,之前我參與過的某個產品就曾出過故障,原因是某個API呼叫突然間增加了數十倍,導致服務負載過高,影響了用戶使用,如果當時能夠有一種機制能快速對這個例外的API進行限流或熔斷,就能避免服務陷入不穩定的狀況,云效自身使用阿里云 AHAS (Application High Availability Service)來保障應用的高可用,本文總結了一份AHAS限流實踐指南,如果你的系統有被惡意用戶攻擊的風險,或者系統中某個應用出現例外可能會造成雪崩效應,那么這篇文章會對你有所幫助,

image.png

一個完善的應用高可用解決方案,首先需要對應用的介面進行監控,能夠實時統計當前應用介面的QPS情況,其次要能夠針對不同API和場景配置各種限流和熔斷規則,比如如果某個API QPS超過300了就需要對超過的呼叫做限流處理,能夠提供限流的工具很多,流行的有guava RateLimiter、Hystrix等,但這些工具上手成本較高,搭建起整個體系并不簡單,

如何快速建立應用的限流體系?這就要介紹阿里云提供的應用高可用服務 AHAS (Application High Availability Service),AHAS 是經阿里巴巴內部多年高可用體系沉淀下來的云產品,基于阿里開源流控降級組件 Sentinel,以流量與容錯為切入點,從流量控制、不穩定呼叫隔離、熔斷降級、熱點流量防護、系統自適應過載保護、集群流控、服務防抖動等多個維度來幫助保障服務和網關的穩定性,同時提供秒級的流量監控分析功能,AHAS 不僅在阿里內部淘寶、天貓等電商領域有著廣泛的應用,在互聯網金融、在線教育、游戲、直播行業和其他大型政央企行業也有著大量的實踐,

限流限的是什么

限流的目的是為了避免系統承受過大的流量導致不可用,那么這些流量會來自哪里呢?

按照訪問的方式,可以分為:

  1. HTTP的同步呼叫,比如你在通過瀏覽器訪問一個站點的頁面時候,就會產生這種流量,
  2. 后臺任務呼叫,這個取決于業務形態,比如一個站點向用戶開放了定時執行任務的能力,那么用戶每多配置一個這種任務,就會對系統造成更多的流量,

按照訪問的意圖,可以分為:

  1. 正常業務增長,比如用戶增加了,做了運營活動等等,都會導致整體的業務量增加,
  2. 惡意用戶的惡意行為,比如某個用戶對站點進行DDOS攻擊,或者對于上面提到的那種提供定時執行任務能力的網站而言,惡意的配置大量的定時任務,從而間接對系統造成巨大的負載,等等,

按照訪問的來源,可以分為:

  1. 終端用戶,這些用戶是最終使用者,其總訪問量會隨著正常業務的增長而增長,
  2. 系統呼叫,比如有其他系統基于你的能力構建自己的產品,那么就要和這些系統進行約定,訪問的最大頻率是多少,并把這些頻率的值落地在限流策略中,

了解了流量的來源之后,我們就知道應該限制什么了,

  1. 限制整個系統的使用頻率,這個在實際的使用中,通常會換算成單機的使用頻率,保證單機不被壓垮,同時配合告警,出現瓶頸時候,通過緊急擴容來解決問題,
  2. 限制單個用戶(或者單個租戶,取決于你的業務形態)的使用頻率,
  3. 限制上游不同的系統呼叫的使用頻率,
  4. 針對上述的限制,都需要能夠支持HTTP的同步呼叫和后臺任務呼叫,

接下來我們從保證系統整體可用性、防止個別用戶濫用、隔離上游系統例外呼叫以及全方位限流4個方面,具體講解如何使用阿里云AHAS實作限流,

保證系統整體可用性

配置限流時,我們需要建立一個通用的限流規則保障核心介面的穩定性,避免單點瓶頸引發全域問題,

一個流控規則包含以下內容:

  • 介面名稱:即對哪個介面進行流控,
  • 來源應用:設定為default,即對所有呼叫方都一視同仁,對整個系統的呼叫進行限流,關于這個配置的用法,會在后面的“針對其他上游系統呼叫的限流”部分展開討論,
  • 單機QPS閾值:單機的QPS容量,超過閾值后會被限流
  • 流控效果:當介面呼叫超過QPS閾值后的處理措施

image.png

我們也可以配置觸發限流后的介面回傳值,對于Web介面而言,通常被限流的介面會回傳429 Too Many Requests錯誤碼,告知呼叫方請求太頻繁,

image.png

對一個介面進行限流時,難點是填寫具體的QPS閾值,我們可以在性能測驗環境對應用進行壓測,壓出單機下某個介面的QPS極限值,然后將閾值定為極限值的某個比例,比如極限值的90%,比如某個介面單機可承受極限為200QPS,那么閾值可定為200*90%= 180,

防止個別用戶濫用

這個場景下,需要先梳理出來系統的核心業務入口,通常是service層的一個入口函式,針對每個入口函式預設單個用戶合理的使用頻率,然后就可以利用AHAS的熱點引數流控能力,來并進行限制,

在入口函式上添加注解:

@SentinelResource(value = "https://www.cnblogs.com/yyds114/p/biz1")
public Result doBussinessLogic(String uid, int type) {
    // uid引數索引為0,type引數索引為1,
    // some logic here...
}

代碼中需要做兩件事情

  1. 從請求中提取出需要防護的維度,比如上面代碼中的uid,即用戶的標識,并保證該標識作為業務入口函式的入參傳入,
  2. 給該函式添加@SentinelResource注解,其中的value="https://www.cnblogs.com/yyds114/p/biz1"為這個資源的標識,會用在控制臺配置中進行參考,

然后在控制臺進行配置,假設我們希望,在服務級別每分鐘單用戶最多呼叫20次,服務共有5個實體,可以進行如下配置,意思是在第0個引數,也就是用戶,這個維度上進行限流,單機最多每60s進行4次呼叫,則集群維度就是每分鐘最多20次呼叫,

image.png

目前AHAS還不支持直接進行集群維度的配置,實際使用中需要簡單的換算下,

詳細說明,請參考:
https://help.aliyun.com/document_detail/147896.html ,

隔離上游系統例外呼叫

對于一個應用的介面來說,通常會被上游多個系統呼叫,上面雖然介紹了如何對單個介面進行整體限流,但實際場景中,我們會需要對不同的上游系統采用不同的限流閾值,比如上游呼叫方A是主鏈路,希望QPS閾值能高一些,上游呼叫方B為旁支鏈路,QPS閾值可以低一些,那么我們需要在Web容器啟動時注入抽取租戶特征值的攔截器,根據來源應用標識來對不同來源給予不同的閾值,

@Configuration
public class InterceptorConfiguration extends WebMvcConfigurerAdapter {
    
    @PostConstruct
    public void setOriginParser() {
        WebCallbackManager.setRequestOriginParser(httpServletRequest -> httpServletRequest.getHeader("income"));
    }
}

WebCallbackManager.setRequestOriginParser 接受一個引數為HttpServletRequest的回呼,我們需要通過HttpServletRquest物件中的內容來區分呼叫方A和B,比如應用A和B在呼叫介面時會傳入不同的header income,那么就可以通過該header來區分來源應用A和B,最后在流控規則中建立起對A和B不同限流閾值,如下圖所示,

image.png

 

image.png

全方位限流,不限于HTTP

AHAS可以快速的把Web介面納入到流控之中,但如果我們應用的一些代碼不屬于Web介面,但也想啟用流控,那么仍然可以使用AHAS提供的熱點規則的能力,以下是個示例,

    @SentinelResource(blockHandler = "blockHandlerExecuteTask")
  public Boolean executeTask(Long taskId) throws Exception {
    return taskService.executeTask(taskId);
    }


    public Boolean blockHandlerExecuteTask(Long taskId, BlockException ex) {
        throw new RuntimeException("execute task exceed");
    }

重啟應用后,在介面詳情頁的自定義埋點tab中,就可以看到AHAS收集的自定義埋點介面資料,介面名稱組成為類名:方法名的格式,

image.png

接著可以給這個埋點介面配置限流規則,開啟防護,

image.png

以上就是我們使用AHAS服務時配置限流的常用實踐,希望對大家有所幫助,


點擊下方鏈接,免費體驗云效流水線Flow,

https://www.aliyun.com/product/yunxiao/flow?channel=yy_practice

lQLPDhtDba1KT2_NBDjNB4CwgwE-eOLUK_gCPyXeUECTAA_1920_1080.png

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/449111.html

標籤:其他

上一篇:我是否選擇了正確的公式來計算這個?

下一篇:4種典型限流實踐保障應用高可用|云效工程師指北

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more