如何让服务在流量暴增的情况下保持稳定输出
服务自适应降载保护设计
设计目的
- 保证系统不被过量请求拖垮
- 在保证系统稳定的前提下,尽可能提供更高的吞吐量
设计考虑因素
- 如何衡量系统负载
- 是否处于虚机或容器内,需要读取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个
-
满足以下所有条件则拒绝该请求
-
当前CPU负载超过预设阈值,或者上次拒绝时间到现在不超过1秒(冷却期)。冷却期是为了不能让负载刚下来就马上增加压力导致立马又上去的来回抖动
-
averageFlying > max(1, QPS*minRT/1e3)
-
averageFlying = MovingAverage(flying)
-
在算MovingAverage(flying)的时候,超参beta默认取值为0.9,表示计算前十次的平均flying值
-
取flying值的时候,有三种做法:
- 请求增加后更新一次averageFlying,见图中橙色曲线
- 请求结束后更新一次averageFlying,见图中绿色曲线
- 请求增加后更新一次averageFlying,请求结束后更新一次averageFlying
我们使用的是第二种,这样可以更好的防止抖动,如图:
-
QPS = maxPass * bucketsPerSecond
- maxPass表示每个有效桶里的成功的requests
- bucketsPerSecond表示每秒有多少个桶
-
1e3表示1000毫秒,minRT单位也是毫秒,QPS*minRT/1e3得到的就是平均每个时间点有多少并发请求
-
-
降载的使用
- 已经在rest和zrpc框架里增加了可选激活配置
- CpuThreshold,如果把值设置为大于0的值,则激活该服务的自动降载机制
- 如果请求被drop,那么错误日志里会有
dropreq
关键字
参考资料
项目地址
https://github.com/tal-tech/go-zero
好未来技术

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
ssh 在大厂写React,学到了什么?
前言 进入大厂搬砖也有 3 个月了,我工作中的技术栈主要是 React + TypeScript,这篇文章我想总结一下如何在项目中运用 React 的一些技巧解决一些实际问题,本文中使用的代码都是简化后的,不代表生产环境。生产环境的代码肯定比文中的例子要复杂很多,但是简化后的思想应该是相通的。 取消请求 React 中当前正在发出请求的组件从页面上卸载了,理想情况下这个请求也应该取消掉,那么如何把请求的取消和页面的卸载关联在一起呢? 这里要考虑利用 useEffect 传入函数的返回值: useEffect(()=>{return()=>{//页面卸载时执行};},[]); 假设我们的请求是利用 fetch,那么还有一个需要运用的知识点:AbortController,简单看一下它的用法: constabortController=newAbortController();fetch(url,{//这里传入signal进行关联signal:abortController.signal,});//这里调用abort即可取消请求abortController.abort(); ...
- 下一篇
面试官:说说CountDownLatch,CyclicBarrier,Semaphore的原理?
CountDownLatch CountDownLatch适用于在多线程的场景需要等待所有子线程全部执行完毕之后再做操作的场景。 举个例子,早上部门开会,有人在上厕所,这时候需要等待所有人从厕所回来之后才能开始会议。 publicclassCountDownLatchTest{privatestaticintnum=3;privatestaticCountDownLatchcountDownLatch=newCountDownLatch(num);privatestaticExecutorServiceexecutorService=Executors.newFixedThreadPool(num);publicstaticvoidmain(String[]args)throwsException{executorService.submit(()->{System.out.println("A在上厕所");try{Thread.sleep(4000);}catch(InterruptedExceptione){e.printStackTrace();}finally{count...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)