博客
关于我
如何让服务在流量暴增的情况下保持稳定输出
阅读量:424 次
发布时间:2019-03-06

本文共 1116 字,大约阅读时间需要 3 分钟。

服务自适应降载保护设计

设计目的

  • 保证系统不被过量请求拖垮
  • 在保证系统稳定的前提下,尽可能提供更高的吞吐量

设计考虑因素

  • 如何衡量系统负载
    • 是否处于虚机或容器内,需要读取cgroup相关负载
    • 用1000m表示100%CPU,推荐使用800m表示系统高负载
  • 尽可能小的Overhead,不显著增加RT
  • 不考虑服务本身所依赖的DB或者缓存系统问题,这类问题通过熔断机制来解决

机制设计

  • 计算CPU负载时使用滑动*均来降低CPU负载抖动带来的不稳定,关于滑动*均见参考资料

    • 滑动*均就是取之前连续N次值的*似*均,N取值可以通过超参beta来决定
    • 当CPU负载大于指定值时触发降载保护机制
  • 时间窗口机制,用滑动窗口机制来记录之前时间窗口内的QPS和RT(response time)

    • 滑动窗口使用5秒钟50个桶的方式,每个桶保存100ms时间内的请求,循环利用,最新的覆盖最老的
    • 计算maxQPS和minRT时需要过滤掉最新的时间没有用完的桶,防止此桶内只有极少数请求,并且RT处于低概率的极小值,所以计算maxQPS和minRT时按照上面的50个桶的参数只会算49个
  • 满足以下所有条件则拒绝该请求

    1. 当前CPU负载超过预设阈值,或者上次拒绝时间到现在不超过1秒(冷却期)。冷却期是为了不能让负载刚下来就马上增加压力导致立马又上去的来回抖动

    2. averageFlying > max(1, QPS*minRT/1e3)

      • averageFlying = MovingAverage(flying)

      • 在算MovingAverage(flying)的时候,超参beta默认取值为0.9,表示计算前十次的*均flying值

      • 取flying值的时候,有三种做法:

        1. 请求增加后更新一次averageFlying,见图中橙色曲线
        2. 请求结束后更新一次averageFlying,见图中绿色曲线
        3. 请求增加后更新一次averageFlying,请求结束后更新一次averageFlying

        我们使用的是第二种,这样可以更好的防止抖动,如图:

      • QPS = maxPass * bucketsPerSecond

        • maxPass表示每个有效桶里的成功的requests
        • bucketsPerSecond表示每秒有多少个桶
      • 1e3表示1000毫秒,minRT单位也是毫秒,QPS*minRT/1e3得到的就是*均每个时间点有多少并发请求

降载的使用

  • 已经在rest和zrpc框架里增加了可选激活配置
    • CpuThreshold,如果把值设置为大于0的值,则激活该服务的自动降载机制
  • 如果请求被drop,那么错误日志里会有dropreq关键字

参考资料

项目地址

好未来技术

转载地址:http://ckdyz.baihongyu.com/

你可能感兴趣的文章
并发编程——IO模型详解
查看>>
Java之封装,继承,多态
查看>>
wait()与notify()
查看>>
使用js打印时去除页眉页脚
查看>>
Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)
查看>>
ORA-00904: "FILED_TYPE": 标识符无效
查看>>
数据仓库系列之维度建模
查看>>
java中DelayQueue的使用
查看>>
线程stop和Interrupt
查看>>
Android中定时执行任务的3种实现方法
查看>>
时间序列神器之争:Prophet VS LSTM
查看>>
SpringBoot中关于Mybatis使用的三个问题
查看>>
MapReduce实验
查看>>
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
查看>>
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
查看>>
[apue] getopt 可能重排参数
查看>>
移动互联网恶意软件命名及分类
查看>>
PySide图形界面开发(一)
查看>>
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
查看>>
现代3D图形编程学习-基础简介(2) (译)
查看>>