在微服務架構中,當服務提供者的應用執行個體出現異常,而服務消費者無法感知的時候,會影響服務的正常調用,並影響消費者的服務效能甚至可用性。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,即定義所有業務異常屬於異常 |
結果驗證
離群執行個體摘除策略配置並建立後,即開啟了離群執行個體摘除。您可以進入已配置離群執行個體摘除的進階監控頁面,查看該應用的監控資訊,例如通過拓撲圖觀察調用請求是否還會轉寄到異常執行個體,應用調用的錯誤率/每分鐘是否高於配置的錯誤率下限等,以便判斷離群執行個體摘除策略是否生效。具體操作,請參見應用總覽。