配置熱點規(guī)則
為應(yīng)用配置熱點規(guī)則后,AHAS將分析統(tǒng)計參數(shù),即資源調(diào)用過程中的調(diào)用次數(shù)較高的參數(shù),并根據(jù)配置的熱點規(guī)則對包含熱點參數(shù)的資源調(diào)用進行限流,保護系統(tǒng)穩(wěn)定性。本文介紹如何為應(yīng)用配置熱點規(guī)則。
背景信息
熱點即經(jīng)常被訪問的數(shù)據(jù)。例如在以下場景中需要統(tǒng)計某個熱點數(shù)據(jù)中訪問頻次最高的Top數(shù)據(jù),并對其訪問進行限制。
- 針對一段時間內(nèi)最頻繁購買的商品ID進行限制,防止擊穿緩存而導(dǎo)致大量請求到數(shù)據(jù)庫的情形。
- 針對一段時間內(nèi)頻繁訪問的用戶ID進行限制,防止惡意刷單。
AHAS利用LRU(Least Recently Used)策略統(tǒng)計最近最常訪問的熱點參數(shù),結(jié)合令牌桶算法來進行參數(shù)級別的流控。
使用說明
將應(yīng)用接入AHAS應(yīng)用防護,具體操作請參見接入應(yīng)用方式。
- 若您通過Dubbo應(yīng)用方式接入,AHAS應(yīng)用防護將在方法級別的埋點即方法簽名的接口名,自動按次序傳入調(diào)用的參數(shù),因此可以直接對調(diào)用參數(shù)配置熱點規(guī)則。詳情請參見接入Dubbo應(yīng)用。
- 若您通過注解方式接入,Sentinel會將@SentinelResource注解方式定義的資源作為參數(shù)傳入SphU.entry(res, args)。詳情請參見接入Spring應(yīng)用。 例如以下示例中,uid和type會分別作為第一個和第二個參數(shù)傳入Sentinel API,從而可以用于熱點規(guī)則判斷:
@SentinelResource(value = "myMethod", blockHandler = "myBlockHandlerFunc") public Result doSomething(String uid, int type) { // uid參數(shù)索引為0,type參數(shù)索引為1。 // some logic here... }
- 對于其它方式接入的應(yīng)用,您需要自定義埋點傳入需要進行熱點限流的參數(shù),如IP、User ID等。請參見資源定義類SphU / SphO。
// name: 資源名稱,用于標(biāo)識該調(diào)用。 // EntryType用于區(qū)分該資源是入口流量(inbound)還是出口流量(outbound),EntryType.IN代表入口流量,EntryType.OUT代表出口流量。 // count表示每次調(diào)用計數(shù)為多少,通常傳1。 // args為傳入的參數(shù),用于熱點參數(shù)限流。 public static Entry entry(String name, EntryType entryType, int count, Object... args) throws BlockException
args即待傳入的參數(shù),若有多個待傳入?yún)?shù),則按照次序依次傳入。例如需要傳入兩個參數(shù)paramA和paramB,傳入方式如下:
// paramA對應(yīng)的參數(shù)索引為0,paramB對應(yīng)的參數(shù)索引為1。 // 若需要配置例外項或者使用集群維度流控,則傳入的參數(shù)只支持基本類型。 SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB);
若使用SphU.entry()傳入了熱點參數(shù),那么使用exit的時候也要帶上對應(yīng)的參數(shù)(exit(count, args)),否則并發(fā)線程數(shù)等指標(biāo)會有統(tǒng)計錯誤。正確使用如下:Entry entry = null; try { entry = SphU.entry(resourceName, EntryType.IN, 1, paramA, paramB); // 用戶的業(yè)務(wù)邏輯。 } catch (BlockException ex) { // 觸發(fā)限流降級,在此處進行處理。 } finally { if (entry != null) { // 務(wù)必保證entry成功后最終會exit,并且傳入了對應(yīng)的參數(shù)。 entry.exit(1, paramA, paramB); } }
功能入口
- 登錄AHAS控制臺。
- 在AHAS控制臺左上角,選擇應(yīng)用接入的地域。
- 在控制臺左側(cè)導(dǎo)航欄中選擇 。
- 在應(yīng)用防護頁面的應(yīng)用卡片頁簽單擊目標(biāo)應(yīng)用卡片。
- 在左側(cè)導(dǎo)航欄單擊規(guī)則管理,然后單擊熱點規(guī)則頁簽。
- 在熱點規(guī)則頁簽單擊新增熱點限流規(guī)則。
- 在新增熱點限流規(guī)則對話框中,配置規(guī)則信息。
- 單擊新增。
- 可選:(可選)若需對某些特殊的熱點參數(shù)值單獨配置閾值,則在規(guī)則列表中單擊目標(biāo)規(guī)則操作列的添加例外項,然后在熱點規(guī)則例外項對話框中單擊添加,并填寫單獨配置的參數(shù)信息,然后單擊確定。說明 熱點規(guī)則例外項僅支持基本類型和字符串類型。由于一條規(guī)則只對應(yīng)一個參數(shù)索引位置,因此例外項類型需要保持統(tǒng)一。例如在資源R的參數(shù)索引0處配置一條熱點規(guī)則,閾值為5QPS。若在這條規(guī)則新增兩條例外項:參數(shù)Sentinel閾值為100,參數(shù)AHAS閾值為200。則實際生效的時候,其它熱點參數(shù)會限制每秒鐘訪問不超過5次,而Sentinel和AHAS這兩個參數(shù)值作為例外項,會按照對應(yīng)的例外項閾值生效。
常用場景1 秒殺場景
秒殺等搶購商品的時候,由于流量較大會導(dǎo)致系統(tǒng)響應(yīng)不及時,甚至系統(tǒng)崩潰。為保證系統(tǒng)的穩(wěn)定性,可配置熱點規(guī)則,超過一定量的閾值后,系統(tǒng)會讓購買熱點商品的流量排隊等待。
例如購買同一商品,1s內(nèi)調(diào)用超過100次請求后,則其余請求進行等待。在新建熱點規(guī)則對話框中配置以下規(guī)則信息。
- 填寫接口名稱。
- 統(tǒng)計維度選擇通過請求數(shù)。
- 統(tǒng)計周期時間設(shè)置為1s,單機閾值設(shè)置為100。
- 流控效果選擇排隊等待。
- 超時時間設(shè)置為30 ms。
1s內(nèi)調(diào)用此接口超過100次,多余的請求要進行排隊等待,等待時長超過30 ms的請求就會立即失敗。
常用場景2 調(diào)用請求頻繁,占用較多系統(tǒng)資源
例如秒殺的時候還需要修改下單地址,當(dāng)調(diào)用修改請求較多的時候,會占用了寫數(shù)據(jù)庫較多資源,則可以對其進行熱點快速失敗的處理,稍后再修改。在新建熱點規(guī)則對話框中配置以下規(guī)則信息。
- 填寫接口名稱。
- 統(tǒng)計維度選擇并發(fā)數(shù)。
- 統(tǒng)計周期時間設(shè)置為1s,單機閾值設(shè)置為100。
- 流控效果選擇快速失敗。
表示1s內(nèi)只能最多處理100條修改請求,其余超出的請求都會快速失敗。
更多信息
新建熱點規(guī)則頁面參數(shù)說明如下:
參數(shù) | 描述 |
接口名稱 | 適用該規(guī)則的資源名稱,與埋點傳入的資源名保持一致。 |
參數(shù)位置索引 | 埋點傳入?yún)?shù)的索引位置。對應(yīng)SphU.entry(xxx,args) 中的參數(shù)索引位置。例如SphU.entry(resourceName,Entry Type.IN,1,paramA,paramB) 埋點中,paramA 的參數(shù)索引是0,paramB 的參數(shù)索引是1。 |
統(tǒng)計維度 | 可選擇通過請求數(shù)或并發(fā)線程數(shù)。
|
統(tǒng)計周期時間 | 統(tǒng)計窗口時間長度(單位為秒)。例如統(tǒng)計窗口時長為10s,QPS閾值為5代表限制10s內(nèi)每個熱點參數(shù)訪問不超過5次。 |
單機閾值 | 是作用于每個熱點參數(shù)的閾值。 |
流控效果 | 當(dāng)統(tǒng)計維度為通過請求數(shù)時,可以選擇流控效果來處理被攔截的流量。
|