一、简介
这里的统计主要是触发远程调用的统计,跟负载均衡没啥关系,但是,负载均衡需要这些依赖这些统计信息做为判断的策略。
统计类主要是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的如下代码: