限流、熔断、降级、线程池隔离

文章目录

  • 一、限流
      • 1.1 常见限流方式
          • 1.1.1 固定窗口、滑动窗口、漏斗、令牌桶
          • 1.1.2 令牌桶限流原理-公式
      • 1.2Guava令牌桶使用方式
      • 1.3 其他限流
          • 流控规则配置
          • 阻塞类型
          • 突发流量
          • 限流并且拒绝流量请求,友好提示限流了
  • 二、 熔断
      • 1.1 Thfirt熔断器
  • 三、 线程池隔离
      • 3.1 背景
      • 3.2 使用

一、限流

1.1 常见限流方式

1.1.1 固定窗口、滑动窗口、漏斗、令牌桶

四种常见限流方式

1.1.2 令牌桶限流原理-公式

令牌桶

1.2Guava令牌桶使用方式

Guava-RateLimiter

1.3 其他限流

流控规则配置

集群非精确 + 720次/s (限流周期1s、限流次数720)、阻塞类型:不限时阻塞 + 突发流量1s(缓存一定时间的阈值,应对流量蜂刺)、返回码429、返回信息:导出查询接口被限流

补充详解策略

序号策略类型含义备注极端场景
1集群非精确限流限流策略:5s/一个请求。5台机器平均每个机器0.2个请求/s令牌是会先通过当前的,再阻塞未来的,所以限流不准用户A和B,同一时刻或者5s之内,两次访问请求都可以打进去接口
2集群精确限流1.0限流策略:5s/一个请求 ,即整个集群,5s内只允许通过一个请求5s内,整个集群只会通过1次请求
阻塞类型
序号策略类型使用场景极端场景备注
1限时阻塞集群非精确限流
2不限时阻塞会阻塞线程100qps,5台机器。每台处理20QPS300请求打过来,极端场景全部打到同一个机器A。A,1s只能处理20请求,300请求需要15s,也就是,最后一个线程可能等待15s才能获得令牌执行线程因为限流线程等待了近10s
突发流量

1、定义:

在突发模式中,Guava限流器的桶中令牌是有一个有效期的,有效期的作用是让限流器具有一定的“弹性”,可以根据空闲情况临时超额放行一些请求用于平滑处理突发流量。

2、设置值:1

即保留上1s内,剩下的所有令牌。给下一秒用。

eg:1s生产100令牌。12:00:00没有请求进来,12:00:01的时候,现有可用令牌数量 = 本秒的100 + 上一秒的100 = 200。所以,即时限制了100QPS,在12:00:01的时候,也可能有200个请求打进来

踩坑1: 使用限流器后实际流量总是超过配置阈值

**解释:**这种情况只可能发生下突发模式下,是由2.3小节中介绍的突发流量处理机制导致的。突发模式限流器在向请求发放令牌包括存量令牌与新令牌,新令牌的生成速度等于限流速度,而超额部分的请求来自于存量令牌。在实际流量超过阈值不多的情况下,令牌桶中的令牌需要很长时间才能被耗尽。

踩坑2:在客户端匀速调用的场景中,服务端使用了限流器后发现实际流量无法达到阈值上限【很少见】

**解释:**这种情况是非常偶然的,实际是由于限流配置不当导致的。假设某个客户端以50QPS的速度发出请求,即每20ms一个,服务端的限流器配置为30QPS,且不支持突发流量(突发模式下设置突发时间为0,或者使用了预热模式)。这种情况下服务端会严格按照每30+ms一个的速度接收请求,因此,客户端在20ms之后发出第二个请求时,服务端尚未满足30ms的间隔时间,就出现了每两个请求就有一个被拒绝的现象。读者可参考下图理解这一现象。

**建议:**在遇到这种问题时首先考虑限流阈值是否合理。其次,如果在服务端使用突发模式限流,尽量不要把突发时间(maxBrustSeconds)设置为0。如果使用预热模式限流,应该参考服务容量,配置一个足够大的限流阈值。

限流并且拒绝流量请求,友好提示限流了

自定义blockHandle处理方法

方法的入参和出参 和 限流方法的一致

    public ExportDataTResponse blockHandler(SkuPreSellTRequest request, Operator operator) {LOGGER.info("限流导出request:{}, operator:{}", GsonUtil.toJsonString(request), GsonUtil.toJsonString(operator));ExportDataTResponse response = new ExportDataTResponse();response.setCode(429);response.setMsg(String.format("当前有用户正在操作导出,请 3 s后重试");response.setData("");return response;}

二、 熔断

1.1 Thfirt熔断器

1、默认配置

  • 请求试探窗口:5s(心跳机制)
  • 恢复策略:正常(立即、限时)
  • 降级方法:自定义降级方法(返回常量、抛出异常、脚本)
    @Degrade(key = "自定义key", fallBackMethod = "fallBack")public int getPrice(int param) {//方法内部不要捕获异常,熔断器通过异常判断调用结果int n = random.nextInt(10000);int m = 1;if (n > 9900) {m = 1 / 0;}return m;}// 降级方法,参数和主方法保持一致,注意降级方法必须是public,否则无法被cglib代理增强public int fallBack(int param) {return 0;}
  • 统计窗口:10s
  • 请求总数20
  • 失败率:50%
  • 失败数:2

三、 线程池隔离

3.1 背景

  • 如果某个接口的QPS过高,可能会影响服务提供其他功能接口。
  • 因为thrift单机默认256个工作线程,如果某接口的性能不好,QPS又高,则某个时间点,工作线程可能都被这个接口占用了,导致其他接口不可用。这时候我们就可以使用线程池隔离,动态!!!的给这个接口分配线程池。当超过一定的工作线程,则采用拒绝策略或直接抛出异常,再结合熔断降级方法,10s内20次调用超过50%的失败率,则这个接口会被降级,调用降级方法fallbackMethod。
  • 然后5s之后,心跳机制会去验证这个接口是否恢复正常,如果恢复正常,则接口限时|正常 节奏恢复可用,否则再等5s

3.2 使用

  • 线程池隔离 + 降级熔断方法
  • 同理,限流也可以接口熔断降级方法一起使用
@ThreadPoolExecute(key = "method.querySkuStock", coreSize = 15, maxSize = 30, maxQueueSize = 500, rejectHandler =ThreadPoolExecutor.CallerRunsPolicy.class)
@Degrade(rhinoKey = "asyncMethod", fallBackMethod = "fallbackMethod")
public Future<String> asyncMethod() {return new AsyncResult<String>() {@Overridepublic String invoke() throws Exception {TimeUnit.MILLISECONDS.sleep(500);return "asyncMethod";}};
}public String fallbackMethod(Throwable e) {//do fallback businessreturn "fallback";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用VR+科普点亮科技之光VR航天科普体验巡展

11月22日至26日&#xff0c;第十一届中国(绵阳)科技城国际科技博览会圆满闭幕。本届科博会以“科技引领创新转化开放合作”为主题&#xff0c;创新办展办会模式&#xff0c;搭建高能级科技合作交流平台&#xff0c;展示了国内外科技创新发展成就和最新成果&#xff0c;举办了多…

C++:每日选择题--Day3

第一题 1. 指针变量p进行自加运算(即 执行p;)后,地址偏移值为1,则其数据类型为&#xff0c;char说法是否正确&#xff1f; A&#xff1a;正确 B&#xff1a;错误 答案及解析 B 比如我们的空类&#xff0c;空类所占的字节为1&#xff0c;指向空类的指针&#xff0c;自加运算之后…

内核无锁队列kfifo

文章目录 1、抛砖引玉2、内核无锁队列kfifo2.1 kfifo结构2.2 kfifo分配内存2.3 kfifo初始化2.4 kfifo释放2.5 kfifo入队列2.6 kfifo出队列2.7 kfifo的判空和判满2.8 关于内存屏障 1、抛砖引玉 昨天遇到这样一个问题&#xff0c;有多个生产者&#xff0c;多个消费者&#xff0c…

【从零认识ECS云服务器 | 快速上线个人网站】二、使用ECS云服务器

第二章 使用ECS 2.1 获取ECS 方式一&#xff1a;通过试用中心免费领取ECS实例 满足以下全部条件的阿里云用户&#xff0c;可免费试用云服务器ECS&#xff1a; 阿里云注册会员用户并完成阿里云企业认证或个人认证用户。申请用户是云服务器ECS产品的新用户&#xff0c;可以申…

查询不用order by时结果默认怎么排序

总结: 如果在使用没有指定order by&#xff0c;那么基本上依赖于底层实现的&#xff0c;具体排序规则不定&#xff0c;所以排序的顺序也不固定&#xff0c;可能会随着时间发生变化。 在实际工作中&#xff0c;如果有查询列表展示数据的功能和需求&#xff0c;开发前一定要先确…

近期复习四

目录 ansible.cfg介绍 主机清单&#xff08;常见为INI格式&#xff09; 一.定义主机列表 1.每行写一个 2.主机组 &#xff08;1&#xff09;定义简单主机组 &#xff08;2&#xff09;指定多台主机时可以通过书写范围来表示 &#xff08;3&#xff09;定义嵌套主机组 …

Linux 进程地址空间

文章目录 进程地址空间进程地址空间结构页表虚拟内存写时拷贝 进程地址空间 进程地址空间难以定义&#xff0c;因为它更像是一个中间件。 程序从磁盘中加载到内存&#xff0c;程序的执行需要硬件资源&#xff0c;所以每个程序启动时会创建至少一条进程&#xff0c;进程作为组…

HarmonyOS 修改App的默认加载的界面(ArkTS版本)(十七)

根据鸿蒙系统APP的应用生命周期结构&#xff08;鸿蒙4.0开发笔记之ArkTS语法基础之应用生命周期&#xff09;来看。 1、首先在roject/entry/src/main/ets/entryability/EntryAbility.ts文件中找到UI加载函数&#xff1a;onWindowStageCreate(…){…}&#xff0c;然后找到windo…

【Java】站在巨人的肩膀上,学习别人是如何使用某个方法的。

拿着类名、方法名去下面两个网站中查找&#xff0c;注意需要看下包名是否对应得上。 Best Java Code Examples | Tabnine&#xff08;可携带包名检索&#xff09;grep.app | code search

力扣100 相同的数(两种解法)

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&…

【数据分享】11个城市的出租车(网约车)数据(免费获取)

出租车&#xff08;网约车&#xff09;GPS数据是我们最常使用的交通大数据之一&#xff0c;但是出租车&#xff08;网约车&#xff09;GPS数据没有公开的获取渠道&#xff0c;有些学者可能能通过与相关机构合作拿到数据&#xff0c;但是对于绝大多数普通人是没有这个机会的&…

100天精通风控建模(原理+Python实现)——第8天:风控建模中特征工程是什么?怎么实现?

风控模型已在各大银行和公司都实际运用于业务,用于营销和风险控制等。    之前已经阐述了100天精通风控建模(原理+Python实现)——第1天:什么是风控建模?    100天精通风控建模(原理+Python实现)——第2天:风控建模有什么目的?    100天精通风控建模(原理+Python实现…

【理解ARM架构】中断处理 | CPU模式

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f35c;中断&#x1f368;GPIO中断代码实现 &#x1f35c;CPU&#x1f368;CONTROL…

【SQL思考记录】力扣175. 组合两个表

SQL实现 # Write your MySQL query statement below # 姓、名、城市和州&#xff0c;即last name, first name, City, StateSELECT FirstName, LastName, City, State FROM Person left join Address ON Person.PersonId Address.PersonId;SQL解释 SELECT FirstName, LastNam…

2024王道考研计算机组成原理——存储系统

微信打开的时候会有一个人站在地球上&#xff0c;这个过程就是把程序从辅存转移到主存&#xff0c;数据只有调入主存当中才可以被CPU访问 cache&#xff1a;主存速度还是慢&#xff0c;为了进一步缓解CPU和主存之间的速度矛盾 在微信打视频聊天的时候&#xff0c;在这一段比较…

弘扬中华文化 感受戏曲魅力——安徽演艺小分队赴和田交流演出

为进一步弘扬中华优秀传统文化&#xff0c;促进皖和两地交往交流交融&#xff0c;12月2日&#xff0c;安徽省演艺小分队走进和田新夜市登台演出&#xff0c;黄梅戏、独唱、民乐演奏、杂技等丰富多样的表演&#xff0c;为观众们送上了一场文化盛宴。 安徽演艺小分队赴和田交流演…

一篇文章带你详细了解C++智能指针

一篇文章带你详细了解C智能指针 为什么要有智能指针内存泄漏1.什么是内存泄漏&#xff0c;它的危害是什么2.内存泄漏的分类3.如何避免内存泄漏 智能指针的使用及原理1.RAII2.智能指针的原理3.auto_ptr4.unique_ptr5.shared_ptr6.weak_ptr 为什么要有智能指针 C引入智能指针的主…

WindowsServer服务器系列:定时备份 MySQL

一、编写脚本 echo 取日期、时间变量值 set yy%date:~0,4% set mm%date:~5,2% set dd%date:~8,2% if /i %time:~0,2% lss 10 set hh0%time:~1,1% if /i %time:~0,2% geq 10 set hh%time:~0,2% set mn%time:~3,2% set ss%time:~6,2% set date%yy%%mm%%dd% set time%hh%%mn%%ss…

Vue2中v-html引发的安全问题

前言&#xff1a;v-html指令 1.作用&#xff1a;向指定节点中渲染包含html结构的内容。 2.与插值语法的区别&#xff1a; (1).v-html会替换掉节点中所有的内容&#xff0c;{{xx}}则不会。 (2).v-html可以识别html结构。 3.严重注意&#xff1a;v-html有安全性问题&#xff0…

IT外包的三种模式

在当今数字化时代&#xff0c;企业为了更好地专注于核心业务&#xff0c;通常选择将IT部门或项目外包给专业的IT外包服务公司。IT外包作为一种灵活的业务模式&#xff0c;不仅能够提高效率&#xff0c;还能够降低企业的运营成本。IT外包包含着不同的业务模式&#xff0c;其中有…