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的如下代码:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的酒店管理系统的C语言代码实现: ``` #include <stdio.h> struct hotel { int room_num; int occupied; // 0表示空房,1表示已入住 float rate; }; void check_in(struct hotel rooms[], int room_num) { int i; for (i = 0; i < room_num; i++) { if (rooms[i].occupied == 0) { rooms[i].occupied = 1; printf("请输入房间号(1-%d):", room_num); scanf("%d", &rooms[i].room_num); printf("请输入房间价格:"); scanf("%f", &rooms[i].rate); printf("登记成功!\n"); return; } } printf("抱歉,没有空房间!\n"); } void check_out(struct hotel rooms[], int room_num) { int i, room; printf("请输入要结账的房间号:"); scanf("%d", &room); for (i = 0; i < room_num; i++) { if (rooms[i].room_num == room && rooms[i].occupied == 1) { rooms[i].occupied = 0; printf("结账成功!\n"); return; } } printf("该房间未被入住或房间号错误!\n"); } void print_info(struct hotel rooms[], int room_num) { int i; for (i = 0; i < room_num; i++) { printf("房间号:%d,价格:%.2f,状态:%s\n", rooms[i].room_num, rooms[i].rate, rooms[i].occupied ? "已入住" : "空房"); } } void room_stat(struct hotel rooms[], int room_num) { int i, count = 0; float total = 0; for (i = 0; i < room_num; i++) { if (rooms[i].occupied) { count++; total += rooms[i].rate; } } printf("已入住房间数:%d,入住率:%.2f%%,总收入:%.2f\n", count, (float)count / room_num * 100, total); } int main() { int choice; const int room_num = 10; struct hotel rooms[room_num] = { 0 }; printf("***欢迎使用酒店管理系统***\n"); while (1) { printf("1.登记入住 2.结账 3.查询客房信息 4.客房信息打印 5.客房统计 6.退出\n"); printf("请输入您的选择:"); scanf("%d", &choice); switch (choice) { case 1: check_in(rooms, room_num); break; case 2: check_out(rooms, room_num); break; case 3: print_info(rooms, room_num); break; case 4: print_info(rooms, room_num); break; case 5: room_stat(rooms, room_num); break; case 6: printf("谢谢使用,再见!\n"); return 0; default: printf("请输入正确的选项!\n"); break; } } return 0; } ``` 以上代码实现了一个简单的酒店管理系统,包括登记入住、结账、查询客房信息、客房信息打印、客房统计和退出功能。用户可以根据自己的需求选择相应的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值