7.状态统计

一、简介

这里的统计主要是触发远程调用的统计,跟负载均衡没啥关系,但是,负载均衡需要这些依赖这些统计信息做为判断的策略。

统计类主要是LoadBalancerStats,其内部持有ServerStats对每个server的调用做了相关统计。

二、实现

  1. 成员变量
    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的状态。
  2. 重要的方法
    getZoneSnapshot:根据zone获取到server列表,根据server获取到统计信息,从而计算出整个zone的快照状态,包括如下状态项:
    1. zone中的实例数量
    2. 平均load(活跃请求量/实例数量)
    3. 断路器打开的实例数量
    4. 总活跃请求量
  3. ServerStats是对具体某个server进行状态统计的类,其主要统计项如下:
    1. activeRequestsCount:活跃请求数量(正在请求的数量)。
    2. requestCountInWindow:一个窗口期内的请求数据,窗口期为5分钟。
    3. firstConnectionTimestamp:首次链接时间戳。
    4. lastAccessedTimestamp:最后访问时间戳。
    5. lastActiveRequestsCountChangeTimestamp:最后请求数量变更时间戳。
    6. totalRequests:总请求量。
    7. successiveConnectionFailureCount:连续请求异常数量(后续有一次成功即重置为0)。
    8. lastConnectionFailedTimestamp:最后请求失败时间戳。
    9. serverFailureCounts:server上一秒失败次数。
    10. totalCircuitBreakerBlackOutPeriod:断路器断电总时间段(连续失败>=3次,增加20~30秒)。
    11. responseTimeDist:响应时间分布,包括最大,最小,中位,平均,方差等。
    12. getCircuitBreakerBlackoutPeriod():是方法,获取断路器断电时间段。
    13. getCircuitBreakerTimeout():是方法,获取断路器断电时间戳(lastConnectionFailedTimestamp+getCircuitBreakerBlackoutPeriod())。

三、使用

根据之前介绍的ribbon的组件,这些统计信息都在哪用了呢,下面进行一些举例:
对应监控指标在ribbon中的使用:

调用方使用的指标简介
负载均衡策略 WeightedResponseTimeRuleServerStats.responseTimeDist获取平均响应时间作为权重计算的策略
AvailabilityFilteringRuleServerStats.getCircuitBreakerTimeout()判断当前断路器是否打开作为是否可用的策略
ServerStats.activeRequestsCount使用活跃请求数量选择最小的server
ZoneAvoidanceRuleServerStats.upServerListZoneMap获取可用的所有zone
LoadBalancerStats.getZoneSnapshot获取zone状态信息

四、触发

这些统计的触发点在哪呢?参考RibbonLoadBalancerClient的如下代码:
在这里插入图片描述

发布了62 篇原创文章 · 获赞 23 · 访问量 15万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章