在微服務架構中,當服務提供者的應用實例出現異常,而服務消費者無法感知的時候,會影響服務的正常調用,并影響消費者的服務性能甚至可用性。HSF應用的離群實例摘除功能會檢測應用和服務實例的可用性并進行動態調整,以保證服務成功調用,從而提升業務的穩定性和服務質量。本文介紹如何為HSF應用創建離群實例摘除策略。
背景信息
在下圖的示例場景中,某個系統包含4個應用,A、B、C和D,其中應用A會分別調用應用B、C和D。當應用B、C或D的某些實例異常時(如圖中紅色圓圈所示,應用B有一個異常實例,C和D有2個異常實例),如果應用A無法感知,會導致部分調用失敗。如果B、C、D的異常實例較多,有可能影響應用A的性能甚至服務可用性。
為了保護應用A的服務性能和可用性,可以為應用A配置離群實例摘除。配置后,即可監控B、C、D應用的實例狀態并進行動態調整(摘除或添加),以保證服務成功調用。
離群實例摘除流程如下:
當應用B、C或D的某個實例異常時,系統能夠檢測到,并根據配置的摘除實例比例上限判斷是否將對應的實例從應用中摘除。
摘除實例后,A的調用請求不再被分發到B、C、D的異常實例上。
按配置的恢復檢測單位時間開始檢測異常實例是否恢復。
檢測間隔隨檢測次數按恢復檢測單位時間(默認為0.5分鐘)線性增加,當達到設置的未恢復累計次數上限后,會按最長時間間隔持續檢測異常實例是否恢復。
當檢測到實例恢復后,將實例重新添加到應用的實例列表中,處理調用請求。同時,將檢測間隔重置為恢復檢測單位時間,例如0.5分鐘。
當提供者應用的異常實例數量過多(超過摘除實例比例上限)時,僅按照設置的比例摘除。
當提供者應用中僅剩最后一個可用實例時,即使錯誤率超過配置的閾值,也不會摘除該實例。
創建離群實例摘除策略
HSF應用可以創建應用和服務兩個級別的離群實例摘除策略。
登錄EDAS控制臺。
在左側導航欄,選擇 。
在配置列表頁面,選擇地域和微服務空間,然后單擊創建配置按鈕。
在創建配置頁面,輸入參數和配置內容,然后在頁面下方單擊創建。
離群實例摘除配置參數說明:
所屬地域:為您創建配置前所選的地域,不可修改。
命名空間:為您創建配置前所選的命名空間,不可修改。
Data ID:配置ID,格式為
<App ID>.QOSCONFIG
。App ID
可以在應用詳情頁獲取。Group:配置為HSF,不可修改。
數據加密:選擇配置數據是否加密。如果配置包含敏感數據,建議配置加密功能,以降低配置泄漏風險。
配置格式:選擇配置內容的數據格式。系統會按照您選擇的格式進行數據校驗。
配置內容:輸入離群實例摘除策略的配置。
通過屬性及其值配置HSF應用的離群實例摘除策略。可以基于應用和服務兩種級別的進行配置,下面分別提供了這兩種級別的配置示例。
說明服務級配置優先級高于應用級配置。
應用級離群實例摘除配置示例
{ "DEFAULT": { "errorRateThreshold":0.5, "isolationTime":60000, "maxIsolationRate":0.2, "maxIsolationTimeMultiple":15, "qosEnabled":true, "requestThreshold":20, "timeWindowInSeconds":10, "ipDimension":true } }
服務級離群實例摘除配置示例
{ "DEFAULT": { "errorRateThreshold":0.5, "isolationTime":60000, "maxIsolationRate":0.2, "maxIsolationTimeMultiple":15, "qosEnabled":true, "requestThreshold":20, "timeWindowInSeconds":10 }, "service:version": { "errorRateThreshold":0.5, "isolationTime":60000, "maxIsolationRate":0.2, "maxIsolationTimeMultiple":15, "qosEnabled":true, "requestThreshold":20, "timeWindowInSeconds":10 } }
如果您有其他需求,可以參考進行離群實例摘除參數說明配置。
離群實例摘除參數說明
您可以在配置管理中通過屬性配置離群實例摘除策略,也可以在JVM中通過-D參數配置離群實例摘除策略。配置管理的配置優先級高于-D參數的配置優先級,推薦使用配置管理。
參數名稱 | 屬性 | -D參數 | 作用 | 默認值 |
調用次數閾值 | requestThreshold | -Dhsf.qos.request.threshold | 最近一次統計窗口內調用超過設置的調用次數閾值才會離群實例摘除。 | 10次 |
錯誤率下限 | errorRateThreshold | -Dhsf.qos.error.rate.threshold | 當被調用的應用或服務中某個實例的錯誤率高于設置的下限后,將摘除該實例。 | 0.5 |
摘除實例比例上限 | maxIsolationRate | -Dhsf.qos.max.isolation.rate | 摘除的異常實例比例上限,即達到閾值后,不再摘除異常實例。摘除異常實例數向下取整,例如應用實例總數為6,摘除實例比例設置為60%,摘除實例數為6×60%=3.6,則按策略最多摘除的實例數為3。若計算結果小于1,則摘除1個實例。 | 0.2 |
恢復檢測單位時間 | isolationTime | -Dhsf.qos.isolation.time | 在異常實例被摘除后,EDAS會不斷按單位時間累加檢測異常實例是否恢復正常,單位為ms。 | 60*1000ms(1分鐘) |
未恢復累計次數上限 | maxIsolationTimeMultiple | -Dhsf.qos.max.isolation.time.multiple | EDAS會持續對異常實例進行檢測,檢測間隔隨檢測次數按恢復檢測單位時間線性增加,當達到設置的檢測次數上限后,會按最長時間間隔持續檢測異常實例是否恢復。例如恢復檢測單位時間設置60000 ms,未恢復累計次數上限設置為60,在第60次檢測異常實例仍未恢復后,則會按60分鐘(60×60000 ms)為間隔執行后續的檢測。如果檢測到實例已經恢復,則會將檢測間隔重置為初始的時間間隔,即一次恢復檢測單位時間。 | 60次 |
開啟離群實例摘除 | qosEnabled | -Dhsf.qos.enable | 是否對應用或服務開啟離群實例摘除。 | false |
統計窗口 | timeWindowInSeconds | -Dhsf.qos.time.window.in.seconds | 調用次數閾值的統計窗口,即統計時間周期。 | 10s |
異常類型 | bizExceptionPredicateClassName | -Dhsf.qos.biz.exception.class.name | 設置應用或服務實例異常類型。默認是所有業務異常,也可以通過自定義接口定義哪些屬于業務異常。例如:
| com.taobao.hsf.exception.CountBizExceptionPredicate,即定義所有業務異常屬于異常 |
結果驗證
離群實例摘除策略配置并創建后,即開啟了離群實例摘除。您可以進入已配置離群實例摘除的高級監控頁面,查看該應用的監控信息,例如通過拓撲圖觀察調用請求是否還會轉發到異常實例,應用調用的錯誤率/每分鐘是否高于配置的錯誤率下限等,以便判斷離群實例摘除策略是否生效。具體操作,請參見應用總覽。