一、簡介
這裏的統計主要是觸發遠程調用的統計,跟負載均衡沒啥關係,但是,負載均衡需要這些依賴這些統計信息做爲判斷的策略。
統計類主要是LoadBalancerStats,其內部持有ServerStats對每個server的調用做了相關統計。
二、實現
- 成員變量
1.1 LoadBalancerStats內部有兩個成員變量,一是upServerListZoneMap,二是serverStatsCache
1.2 upServerListZoneMap定義爲volatile Map<String, List<? extends Server>>,其中存儲了zone和server列表的對應關係。
1.3 serverStatsCache定義爲LoadingCache<Server, ServerStats>,存儲了server和ServerStats對象的對應關係,其使用了guaua的cache。
1.4 根據以上兩種結構,能夠從每個server的狀態統計到整個zone的狀態。 - 重要的方法
getZoneSnapshot:根據zone獲取到server列表,根據server獲取到統計信息,從而計算出整個zone的快照狀態,包括如下狀態項:- zone中的實例數量
- 平均load(活躍請求量/實例數量)
- 斷路器打開的實例數量
- 總活躍請求量
- ServerStats是對具體某個server進行狀態統計的類,其主要統計項如下:
- activeRequestsCount:活躍請求數量(正在請求的數量)。
- requestCountInWindow:一個窗口期內的請求數據,窗口期爲5分鐘。
- firstConnectionTimestamp:首次鏈接時間戳。
- lastAccessedTimestamp:最後訪問時間戳。
- lastActiveRequestsCountChangeTimestamp:最後請求數量變更時間戳。
- totalRequests:總請求量。
- successiveConnectionFailureCount:連續請求異常數量(後續有一次成功即重置爲0)。
- lastConnectionFailedTimestamp:最後請求失敗時間戳。
- serverFailureCounts:server上一秒失敗次數。
- totalCircuitBreakerBlackOutPeriod:斷路器斷電總時間段(連續失敗>=3次,增加20~30秒)。
- responseTimeDist:響應時間分佈,包括最大,最小,中位,平均,方差等。
- getCircuitBreakerBlackoutPeriod():是方法,獲取斷路器斷電時間段。
- getCircuitBreakerTimeout():是方法,獲取斷路器斷電時間戳(lastConnectionFailedTimestamp+getCircuitBreakerBlackoutPeriod())。
三、使用
根據之前介紹的ribbon的組件,這些統計信息都在哪用了呢,下面進行一些舉例:
對應監控指標在ribbon中的使用:
調用方 | 使用的指標 | 簡介 | |
---|---|---|---|
負載均衡策略 | WeightedResponseTimeRule | ServerStats.responseTimeDist | 獲取平均響應時間作爲權重計算的策略 |
AvailabilityFilteringRule | ServerStats.getCircuitBreakerTimeout() | 判斷當前斷路器是否打開作爲是否可用的策略 | |
ServerStats.activeRequestsCount | 使用活躍請求數量選擇最小的server | ||
ZoneAvoidanceRule | ServerStats.upServerListZoneMap | 獲取可用的所有zone | |
LoadBalancerStats.getZoneSnapshot | 獲取zone狀態信息 |
四、觸發
這些統計的觸發點在哪呢?參考RibbonLoadBalancerClient的如下代碼: