高并发中的 限流、熔断、降级、预热、背压你都知道是什么意思吗?

掌握Java中的:概念、实际例子和实现 是管理数据流系统的一个至关重要的概念,可确保用户能够处理传入的数据而不会不知所措。网飞、YouTube和Hulu等平台利用来提供高质量的视频内容,同时确保用户的设备和网络能够处理传入的数据流。本文将探讨的概念、它的重要性、真实世界的例子以及如何使用Java 语言(一种计算机语言,尤用于创建网站)代码。是在涉及数据流的系统中使用的一种技术,在这种系统中,数据产生速率可能超过消耗速率。在没有管理的系统中,消费者可能难以处理数据的涌入,导致处理速度缓慢、内存问题甚至崩溃。 阅读详情

首先,我们需要明确一下这几个名词出现的场景:分布式高并发环境。如果你的产品卖相不好,没人鸟它,那它就用不着这几个属性。不需要任何加成,低并发系统就能工作的很好。

分布式系统是一个整体,调用关系错综复杂,其中某个资源异常,大概率会造成级联故障。当系统处于超负荷的压力之下,容器或者宿主机,将表现的异乎寻常的脆弱。load飙升、拒绝相应,甚至于雪崩,造成的后果都比较严重。

鉴于分布式系统病娇娘样式的反应,我们有各种手段来处理这些异常状况。接下来,我们将简要介绍一下这些场景,还有常用的手段。

1. 限流

“我的贴子被限流了!” 即使不是互联网从业人员,也能言之凿凿的说出这样的话。当他这么说的时候,他并不是在说高并发中的限流,它只是逻辑意义上的。

web开发中,tomcat默认是200个线程池,当更多的请求到来,没有新的线程能够去处理这个请求,那这个请求将会一直等待在浏览器方。表现的形式是,浏览器一直在转圈(还没超过acceptCount),即使你请求的是一个简单的Hello world。

你可以把这个过程,也看作是限流。它在本质上,是设置一个资源数量上限,超出这个上限的请求,将被缓冲,或者直接失败。

对于高并发场景下的限流来说,它有特殊的含义:它主要是用来保护底层资源的。如果你想要调用某些服务,你需要首先获取调用它的许可。限流一般由服务提供方来提供,对调用方能够做事的能力进行限制。

比如,某个服务为A、B、C都提供了服务,但根据提前申请的流量预估,限制A服务的请求为1000/秒、B服务2000/秒,C服务1w/秒。在同一时刻,某些客户端可能会出现被拒绝的请求,而某些客户端能够正常运行,限流被看作是服务端的自我保护能力。

常见的限流算法有:计数器、漏桶、令牌桶等。但计数器算法无法实现平滑的限流,在实际应用中使用较少。

2. 熔断

通常来说,皇帝在微服务里想夜生活过得舒服,能够大刀阔斧单刀直入,不因私事丢江山,就不得不靠熔断大总管。熔断的作用,主要是为了避免服务的雪崩

如图,A→B→C互相依次调用,但C项目很可能出现问题(流量过大或者报错等),就会引发线程一直进行等待,导致拖垮整个链路层,线程资源耗尽。

image.png

意如其名,熔断就像是保险丝,超过负载了保险丝就烧掉了。当然,当后端服务缓和的时候,我们还可以再把它接上。熔断功能一般由调用端提供,用在不太重要的旁路请求上,避免这些不重要的服务因为异常或者超时,影响正常的、重要的业务逻辑

在实现上,我们可以把熔断看作是一种代理模式。当熔断打开的时候,服务将暂停对其保护资源的访问,并返回固定的或者不产生远程调用的默认结果。

3. 降级

降级是一个比较模糊的说法。限流、熔断,在一定程度上,也可以看作是降级的一种。但通常所说的降级,切入的层次更加高级一些。

降级一般考虑的是分布式系统的整体性,从源头上切断流量的来源。比如在双11的时候,为了保证交易系统,将会暂停一些不重要的服务,以免产生资源争占。服务降级有人工参与,人为使得某些服务不可用,多属于一种业务降级方式。

在什么地方最适合做降级呢?就是入口。比如Nginx,比如DNS等。

在某些互联网应用中,会存在MVP(Minimum Viable Product)这个概念,意为最小化可行产品,它的SLA要求非常高。围绕着最小可行性产品,会有一系列的服务拆分操作,当然某些情况甚至需要重写。

比如,一个电商系统,在极端情况下,只需要把商品显示出来,把商品卖出去就行。其他一些支撑性的系统,比如评论、推荐等,都可以临时关掉。在物理部署和调用关系上,就要考虑这些情况。

4. 预热

请看下面一种情况。

一个高并发环境下的DB,进程死亡后进行重启。由于业务处在高峰期间,上游的负载均衡策略发生了重分配。刚刚启动的DB瞬间接受了1/3的流量,然后load疯狂飙升,直至再无响应。

原因就是:新启动的DB,各种Cache并没有准备完毕,系统状态与正常运行时截然不同。可能平常1/10的量,就能够把它带入死亡。

同理,一个刚刚启动的JVM进程,由于字节码并未被JIT编译器优化,在刚启动的时候,所有接口的响应时间都比较慢。如果调用它的负载均衡组件,并没有考虑这种刚启动的情况,1/n的流量被正常路由到这个节点,就很容易出现问题。

所以,我们希望负载均衡组件,能够依据JVM进程的启动时间,动态的慢慢加量,进行服务预热,直到达到正常流量水平。

5. 背压

考虑一下下面两种场景:

  1. 没有限流。请求量过高,有多少收多少,极容易造成后端服务崩溃或者内存溢出
  2. 传统限流。你强行规定了某个接口最大的承受能力,超出了直接拒绝,但此时后端服务是有能力处理这些请求的

如何动态的修改限流的值?这就需要一套机制。调用方需要知道被调用方的处理能力,也就是被调用方需要拥有反馈的能力。背压,英文Back Pressure,其实是一种智能化的限流,指的是一种策略。

背压思想,被请求方不会直接将请求端的流量直接丢掉,而是不断的反馈自己的处理能力。请求端根据这些反馈,实时的调整自己的发送频率。比较典型的场景,就是TCP/IP中使用滑动窗口来进行流量控制。

反应式编程(Reactive)是观察者模式的集大成者。它们大多使用事件驱动,多是非阻塞的弹性应用,基于数据流进行弹性传递。在这种场景下,背压实现就简单的多。

背压,让系统更稳定,利用率也更高,它本身拥有更高的弹性和智能。

总结

简单总结一下:

  • 限流 规定一个上限,流量超过系统承载能力时,会直接拒绝服务
  • 熔断 不因底层旁路应用的故障,造成系统雪崩。欲练此功,必先自宫
  • 降级 从请求入口,大范围的灭掉过载请求
  • 预热 给系统一些启动预热时间,加载缓存,避免资源死锁
  • 背压 被调用方反馈自己的能力给调用方。温柔的调用,需要坚实的沟通

简单来讲,只要流量不进系统,什么都好说,降级是最威猛最霸道的手段;一旦流量进入系统,就要接受系统内一系列规则的制约,其中限流是最直接的手段,将请求拦在外面。虽然用户的请求失败了,但我的系统还能活;没有熔断的系统就很凶残,很容易让三流功能影响主要功能,所以要在合适的时候打开它;至于预热,不过是在爱情火花前的一系列前戏,直到服务的巅峰状态;当然,相对与请求扔出去就不管的模式,如果被调用方能够反馈自己的状态,那么请求方就可以根据需要加大或者缩减马力,这就是背压的思想。

这些手段,都是在有限的资源下,有效的处理手段。但如果公司有钱,有弹性处理手段,这些都会变成辅助手段。毕竟,当所有的服务,能够将自己的状态,反馈到监控中心,监控中心能够实现弹性扩容。只要服务拆分的满足水平扩展,我们只需要增加实例就够了。

为了让大家更好的学习高并发我从阿里的好哥那里弄到了一份《深入理解高并发编程》今天免费分享给大家,这份资料包含了基础-实战-源码-面试-系统架构对这份深入理解高并发编程电子书感兴趣的朋友请点赞转发加关注,资料的获取方式我放在了文末

一、基础案例篇

  • 工作了3年的程序员小菜面试高并发岗位被吊打虐哭

  • 导致并发编程频繁出问题的“幕后黑手”

  • 解密诡异并发问题的第一个幕后黑手——可见性问题

  • 解密导致并发问题的第二个幕后黑手——原子性问题

  • 解密导致并发问题的第三个幕后黑手——有序性问题

  • 如何解决可见性和有序性问题?这次彻底懂了!

  • synchronized原理

  • 为何在32位多核CPU_上执行long型变量的写操作会出现诡异的Bug问题?

  • 如何使用互斥锁解决多线程的原子性问题?

  • ThreadLocal学会了这些,你也能和面试官扯皮了!

  • 学好并发编程,关键是要理解这三个核心问题

  • 什么是ForkJoin?看这一篇就够了 !

  • 你知道吗?大家都在使用Redisson实现分布式锁了! !

  • 为何高并发系统中都要使用消息队列?

  • 高并发环境下如何优化Tomcat配置?看完我懂了!

  • 不废话,言简意赅介绍BlockingQueue

  • 高并发环境下如何防止Tomcat内存溢出?

  • 高并发下常见的限流方案

  • Redis如何助力高并发秒杀系统?看完这篇我彻底懂了! !

  • 一文搞懂PV、UV、W、IP及其关系与计算

  • 优化加锁方式时竟然死锁了! !

  • 如何使用互斥锁解决多线程的原子性问题

  • 高并发环境下诡异的加锁问题(你加的锁未必安全)

  • 高并发场景下创建多少线程才合适?一条公式帮你搞定! !

  • 终于弄懂为什么局部变量是线程安全的了! !

  • 线程的生命周期其实没有我们想象的那么简单! !

二、实战案例篇

  • 如何实现亿级流量下的分布式限流?这些理论你必须掌握! !

  • 如何实现亿级流量下的分布式限流?这些算法你必须掌握! !

  • 亿级流量场景下如何为HTTP接口限流?看完我懂了! !

  • 亿级流量场景下如何实现分布式限流?看完我彻底懂了! !

  • 如何实现亿级流量下的分布式限流?

编辑切换为居中

添加图片注释,不超过 140 字(可选)

三、源码分析篇

PS:程序员究竟要不要读源码?

  • 线程与线程池

  • 线程的执行顺序

  • Java中的Callable和Future

  • SimpleDateFormat类的线程安全问题

  • 深度解析ThreadPoolExecutor类源码

  • 深度解析线程池中重要的顶层接口和抽象类

  • 从源码角度分析创建线程池究竟有哪些方式

  • 通过源码深度解析ThreadPoolExecutor类是如何保证线程池正确运行的

  • 通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程

  • 通过源码深度分析线程池中Worker线程的执行流程

  • 从源码角度深度解析线程池是如何实现优雅退出的

  • 深入理解ScheduledThreadPoolExecutor与Timer的区别和简单示例

  • 深度解析ScheduledThreadPoolExecutor类的源代码

  • 深入理解Thread类源码

  • AQS中的CountDownL atch、Semaphore与CyclicBarrier

  • ReentrantLock

  • Threadl ocal学会了这些,你也能和面试官扯皮了!

  • 又一个朋友面试栽在了Thread类的stop0方法和interrupt()方法上!

​)

四、面试篇

  • 面试官:讲讲高并发场景下如何优化加锁方式?

  • 面试官:讲讲什么是缓存穿透?击穿?雪崩?如何解决?

  • 面试官: Java中提供了synchronized,为什么还要提供Lock呢?

  • 面试官:说说缓存最关心的问题是什么?有哪些类型?回收策略和算法?

  • 面试官:性能优化有哪些衡量指标?需要注意什么?

  • 面试官问我如何使用Nginx实现限流,我如此回答轻松拿到了Offer!

  • 如何设计一个支撑高并发大流量的系统?

  • 关于乐观锁和悲观锁,蚂蚁金服面试官问了我这几个问题! !

  • 关于线程池,蚂蚁金服面试官问了我这些内容! !

  • 高并发环境下构建缓存服务需要注意哪些问题?我和阿里P9聊了很久!

五、系统架构篇

  • 高并发秒杀系统架构解密,不是所有的秒杀都是秒杀!

  • 高并发分布式锁架构解密,不是所有的锁都是分布式锁! !

这篇高并发编程包含了基础-实战-源码-面试-系统架构五大篇幅,由浅入深能很好的帮助你提升高并发知识,提升系统的并发能力!需要这份资料的朋友找小助理免费获取

 

软件测试--用例篇(测试用例的好处、测试用例的七种设计方法、测试用例的粒度、测试用例的评价) 作为软件测试工程师,最主要的工作就是:编写测试用例,那么为什么要编写测试用例?它有什么好处?如何编写测试用例?测试用例写简单好还是复杂好?如何评价测试用例的质量? 天呐撸!能说不会吗?! 作为倾向软件测试工程师的老铁们,还是一起来学习吧! 一、编写测试用例的好处 测试用例是测试者的依据 测试用例使得工作可重复,是自动化测试的基础 补充:自动化测试的前提条件是:功能比较稳定,页面... 阅读详情

相关推荐

DeepSeek API调用太复杂?OneAPI一站式聚合解决方案

本文介绍了OneAPI如何作为一站式聚合解决方案,简化DeepSeek API的调用流程。通过统一接口、智能路由和模型映射等核心功能,OneAPI大幅降低了多API适配的复杂性,提升开发效率。文章还提供了详细的部署指南和高阶使用技巧,帮助开发者快速实现API聚合管理。

weixin_27215337的博客 352

高并发中的 限流熔断降级预热

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。首先,我们需要明确一下这几个名词出现的场景:分布式高并发环境。如果你的产品卖相不好,没人鸟它,那它就用不着这几个...

小姐姐味道 691

基于stm32h743单片机开发_ADS1256(8通道带PGA的24位ADC 软件源码).zip

基于stm32h743单片机开发_ADS1256(8通道带PGA的24位ADC 软件源码).zip

【云原生】服务限流熔断概述、常见限流算法

服务雪崩是什么? 服务熔断降级的解决方案? 为什么要限流? 常见限流算法:固定窗口算法、滑动窗口算法、漏桶算法、令牌桶算法; 几种限流算法的对比?

健身变秃,coding变强 1783

和响应流标准

先来说一下(back pressure),是响应式系统引入的概念,响应式系统是基于消息驱动的,响应式宣言对消息驱动属性的详细描述如下: Message Driven: Reactive Systems rely on asynchronous message-passing to establish a boundary between components that ensures ...

几钱清风 1451

超时,重试,熔断限流

[size=medium][color=black][b]1 写在前面[/b][/color][/size] [size=medium][color=black][b]1.1 名词解释[/b][/color][/size] consumer表示服务调用方 provider标示服务提供方,dubbo里面一般就这么讲。 下面的A调用B服务,一般是泛指调用B服务里面的一个接口。...

RodJohnson_523391的专栏 1722

高并发架构实战:从限流熔断到自适应降级的全链路防护

高并发防护的本质是在系统容量与用户体验之间寻找动态平衡。限流是第一道闸门,控制流量入口的总量;熔断是第二道防线,隔离故障避免级联崩溃;自适应降级是最后一道保障,在系统濒临过载时主动收缩。三者协同构成全链路防护体系。落地路线建议:第一步,在网关层接入集群限流,保护全局流量入口;第二步,对核心服务配置熔断规则,优先保护数据库等不可轻易扩容的存储层;第三步,上线自适应降级,根据系统负载动态调整准入阈值;第四步,建立全链路测与混沌工程体系,持续验证防护规则的有效性。

dicky_zhang3的博客 1437

高并发系统设计:降级熔断限流与缓存预热

缓存降级是指当访问量剧增、服务出现问题(比如响应时间慢或者不响应)或者非核心服务影响到核心流程的性能时,即使是有损部分其他服务,仍然需要保证主服务可用,可以将其他次要访问的数据进行缓存降级,从而提升主服务的稳定性 降级的目的是保证核心服务可用,即使可能有损其他操作。比如双十一的时候淘宝购物车无法修改地址只能使用默认地址,这个服务就是被降级了,这是阿里为了保证订单可以正常提交和付款,但修改地址的服务可以在服务器力降低,并发量相对减少的时候再恢复。 缓存降级是指缓存失效或者缓存服务器挂掉的情况下,不去访问数

OceanStar的博客 4542

36、熔断-限流-降级

限流熔断最终都会导致用户的体验降级限流:流量2k,但是我的服务能力只有1k,所以这个时候多出来的流量怎么办?a.拒绝;b.排队等待;用户体验用户体验不好:当前访问用户过多,请稍后重试用户体验降级:原本是访问流畅,下单流畅 -> 当前访问用户过多,请稍后重试熔断:比如A服务访问B服务,这时候B服务很慢(B服务力过大,导致了出现不少请求错误),调用方很容易出现一个问题:每次调用都超时。...

qq23001186的博客 1631

golang 熔断限流降级

限流 - 2k 但是我的服务能力只有1k,所以这个时候多出来的流量怎么办: 1. 拒绝 2. 排队等待。用户体验不太好: 当前访问用户过多,请稍后重试和你的服务直接挂了 用户体验降级了 - 原本是访问流畅,下单流畅 -> 当前访问用户过多,请稍后重试 熔断 - 比如A服务访问B服务,这个时候B服务很慢 - B服务力过大,导致了出现了不少请求错误,调用方很容易出现一个问题: 每次调用都超时 2k,结果这个时候数据库出现了问题, 超时重试 - 网络 2k的流量突然变成了3k。这让原本就满负荷的b服务雪上

weixin_44575660的博客 1116

限流熔断降级

对单位时间内进入系统 / 接口的请求数量、并发数做硬性阈值限制,超额请求直接拦截或排队,从入口端控制流量规模。当下游依赖(Redis、MySQL、微服务)出现持续超时、错误率飙升、失败次数超标时,临时切断对该下游的调用链路,避免无效请求堆积拖垮上游,类似电路保险丝的「过载断开」机制。系统力过载或依赖故障时,主动关闭非核心功能、返回预设兜底数据、简化业务逻辑,牺牲非核心体验,释放资源保障核心业务可用。

qq_74743057的博客 841

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

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

tmax52HZ的博客 1446

【微服务】限流熔断降级

限流降级熔断的定义、常见场景、策略和实现方式。包含阿里实现Sentinel的使用的案例,以及对限流算法的学习实践

z036548的博客 5549

【通俗易懂】限流降级熔断有什么区别?

限流的是控制系统的并发流量,通过限制请求流量的手段防止过度的流量导致系统崩溃。一般用于应对突发流量高峰。一般是被调用方对调用方进行限流。举个例子,我提供了一个查询用户信息服务,给集团内外的很多调用方使用,但是我为了保证我的可用性,我会对每个调用方做限流,防止某个月调用方不守规矩,把我的服务打挂了。

qq_38196449的博客 4403

微服务之熔断限流降级 三板斧

微服务治理之降级&限流&熔断

weixin_44834554的博客 6455

微服务架构三大利器:限流降级熔断

限流降级熔断是分布式系统中常用的容错策略,它们各自承担着不同的角色,以提高系统的稳定性和可靠性。限流降级熔断是分布式系统中不可或缺的容错策略。它们通过不同的机制和作用,共同保障系统的稳定性和可靠性。在实际应用中,需要根据系统的具体情况和配置来灵活选择和配置这些策略,以达到最佳的效果。同时,也需要注意这些策略之间的相互影响和配合,以确保系统能够高效、稳定地运行。

拥有必珍惜 2361

什么事分布式系统中的

是分布式系统中的一种技术,通过控制请求流来防止过载和级联故障。一场不受控制的洪水甚至会冲走最坚固的水坝。–古老的谚语上面的引述表明,即使是最坚固、设计最精良的大坝也无法承受不受控制和控制的洪水的破坏力。同样,在分布式系统的上下文中,未经检查的调用方通常会使整个系统不堪重负并导致级联故障。在上一篇文章中,我写了如果没有适当的护栏,重试风暴如何有可能使整个服务瘫痪...

948

每日一博 - (Backpressure)的核心原理与实现方式

本文系统介绍了(Backpressure)机制的概念、原理及典型应用场景。指当消费者处理能力不足时,通过反馈机制使生产者主动限流,避免系统崩溃。文章详细解析了的产生景(生产消费速率不匹配)、核心原理(缓冲区监控、阈值判断、信号反馈和速率调整)以及实现方式。典型案例包括TCP流量控制、Reactive Streams和Kafka消息队列,展示了不同场景下的应用。最后总结了设计要点,强调其在保障系统稳定性中的关键作用。

小工匠 3470

机制的运用

的概念(Back Pressure)机制是老吕在学习 RxJava和Reactive响应式编程框架时学习到的一种概念,后来被我运用在了项目中真的解决了问题。的字面意思就是 后...

super_scan的专栏 966
上一篇: 为什么都说HashMap 是线程不安全的?
下一篇: 一款基于 Java 的可视化 HTTP API 接口开发神器
Java架构设计
博客等级 码龄5年 829粉丝 608原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值