php熔断机制,如何保证核心链路稳定性的流控和熔断机制?

php熔断机制,如何保证核心链路稳定性的流控和熔断机制?仅从设计优化、服务拆分、自动扩容等方面进行优化,有时候并不能完全解决问题。比如,有时流量增长过快,扩容流程还来不及完成,服务器可能就已经抗不住了既然突发流量我们没法预测,业务上也不可能不依赖任何外部服务和资源,那么有什么办法能尽量避免,或者降低出现这些问题时对核心业务的影响呢?流量控制01.流控常用的算法目前业内常用的流控方法有两种:漏桶算法和令牌桶算法漏桶算法“漏桶算法”的主要目的是控制数据注…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

仅从设计优化、服务拆分、自动扩容等方面进行优化,有时候并不能完全解决问题。 比如,有时流量增长过快,扩容流程还来不及完成,服务器可能就已经抗不住了

既然突发流量我们没法预测,业务上也不可能不依赖任何外部服务和资源,那么有什么办法能尽量避免,或者降低出现这些问题时对核心业务的影响呢?

流量控制

01.流控常用的算法

目前业内常用的流控方法有两种:漏桶算法和令牌桶算法

漏桶算法

“漏桶算法”的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。“漏桶算法”在实现上文如其名:它模拟的是一个漏水的桶,所有外部的水都先放进这个水桶,而这个桶以匀速往外均匀漏水,如果水桶满了,外部的水就不能再往桶里倒了。这里你可以把这些外部的水想象成原始的请求,桶里漏出的水就是被算法平滑过后的请求。从这里也可以看出来,漏桶算法可以比较好地控制流量的访问速度。

令牌算法

令牌桶算法是流控中另一种常用算法,控制的是一个时间窗口内通过的数据量。令牌桶算法大概实现是这样的:

每 1/r 秒往桶里放入一个令牌,r 是用户配置的平均发送速率(也就是每秒会有 r 个令牌放入)。

桶里最多可以放入 b 个令牌,如果桶满了,新放入的令牌会被丢弃。

如果来了 n 个请求,会从桶里消耗掉 n 个令牌。

如果桶里可用令牌数小于 n,那么这 n 个请求会被丢弃掉或者等待新的令牌放入。

930e4a863a27317534523ebc1f8b40f3.png

算法按一定速度均匀往桶里放入令牌,原始请求进入后,根据请求量从令牌桶里取出需要的令牌数,如果令牌数不够,会直接抛弃掉超限的请求或者进行等待,能成功获取到令牌的请求才会进入到后端服务器。

与漏桶算法“精确控制速率”不太一样的是,由于令牌桶的桶本身具备一定的容量,可以允许一次把桶里的令牌全都取出,因此, 令牌桶算法在限制请求的平均速率的同时,还允许一定程度的突发流量。

算法按一定速度均匀往桶里放入令牌,原始请求进入后,根据请求量从令牌桶里取出需

02.全局流控

在分布式服务的场景下,很多时候的瓶颈点在于全局的资源或者依赖,这种情况就需要分布式的全局流控来对整体业务进行保护。

业界比较通用的全局流控方案,一般是通过中央式的资源(如:Redis、Nginx)配合脚本来实现全局的计数器,或者实现更为复杂的漏桶算法和令牌桶算法,比如可以通过 Redis 的 INCR 命令配合 Lua 实现一个限制 QPS(每秒查询量)的流控组件。

6eadfb609cb0a9caabc3812ded3745c5.png

一个需要注意的细节是:在每次创建完对应的限流 Key 后,你需要设置一个过期的时间。整个操作是原子化的,这样能避免分布式操作时设置过期时间失败,导致限流的 Key 一直无法重置,从而使限流功能不可用。此外,在实现全局流控时还有两个问题需要注意:一个是流控的粒度问题,另一个是流控依赖资源存在瓶颈的问题。下面我们分别来看一下,在实现全局流控时是如何解决这两个问题的。

03.细粒度控制

首先是针对流控的粒度问题。举个例子:在限制 QPS 的时候,流控粒度太粗,没有把 QPS 均匀分摊到每个毫秒里,而且边界处理时不够平滑,比如上一秒的最后一个毫秒和下一秒的第一个毫秒都出现了最大流量,就会导致两个毫秒内的 QPS 翻倍。

一个简单的处理方式是把一秒分成若干个 N 毫秒的桶,通过滑动窗口的方式,将流控粒度细化到 N 毫秒,并且每次都是基于滑动窗口来统计 QPS,这样也能避免边界处理时不平滑的问题。

自动熔断机制

雪崩效应在多依赖服务中往往会导致一个服务出问题,从而拖慢整个系统的情况。

为了便于管理和隔离,我们经常会对服务进行解耦,独立拆分解耦到不同的微服务中,微服务间通过 RPC 来进行调用和依赖:

30a84261e0dd4e926844d5665ee379d1.png

手动通过开关来进行依赖的降级

自动熔断机制主要是通过持续收集被依赖服务或者资源的访问数据和性能指标,当性能出现一定程度的恶化或者失败量达到某个阈值时,会自动触发熔断,让当前依赖快速失败(Fail-fast),并降级到其他备用依赖,或者暂存到其他地方便于后续重试恢复。在熔断过程中,再通过不停探测被依赖服务或者资源是否恢复,来判断是否自动关闭熔断,恢复业务。

——END——

往期推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226845.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • QFile详解

    QFile详解1、QFile::QFile()构造一个没有名字的QFile对象2、QFile::QFile(constQString&name)构造一个以name为文件名的QFile对象。注:也可以QFile::QFile(),然后调用setName()方法来实现类似动作。3、bootQFile::atEnd()const[虚函数]如果已经到达文件末尾则返回TRUE,否则返回FAL

  • 常量字符串过长的解决办法_编译异常和运行异常有哪些

    常量字符串过长的解决办法_编译异常和运行异常有哪些如果使用String str = “这是一个很长很长很长 你需要的字符串。”; 出现异常不能正常编译运行时,可以使用下方:StringBuilder sb = new StringBuilder();sb.append(“这是一个很长很长”);sb.append(“很长 你需要的字符串”);字符串太长或字符串其他情况下可使用 : StringBuilder sb = new StringBuilder()…

  • 用JS打印三角形_用java打印倒三角

    用JS打印三角形_用java打印倒三角打印三角形用”*”打印一个三角形用”*”打印一个倒三角形用”*”打印一个菱形用”*”打印一个三角形核心思想:双重for循环外层for循环起到换行的作用,内层for循环是打印”*”的作用varstr2=”;for(vari=1;i<=6;i++){for(varj=1;j<=i;j++){str2=str2+’*’;}

    2022年10月29日
  • 你还在认为 Java 是免费的吗[通俗易懂]

    你还在认为 Java 是免费的吗[通俗易懂]在收购了Sun公司的六年后,Oracle正在大规模的加大对违反其许可证的Java客户的审查力度。越来越多的Oracle客户和合作伙伴被拉里·埃里森的团队约谈,声称他们没有遵守Java的规矩。Oracle在2010年 收购了SunMicrosystems公司 ,知情人士透露现在它的许可证管理服务(LMS)正在到处追缴付款。该数据库巨头公司目前已经在全球

  • win11安装node并且配置环境变量

    win11安装node并且配置环境变量npm使用过程中的一些错误解决办法及npm常用命令和技巧-世有因果知因求果-博客园用户名是自己的C:\Users\KenKen\AppData\Roaming\npmNODE_PATHC:\ProgramFiles\nodejs\node_modules

  • 网络带宽是什么?「建议收藏」

    网络带宽是什么?「建议收藏」1.网络带宽是指单位时间内能传输的数据量,带宽是为了表示网络中传送数据的能力。2.它的单位是bit/s.实际上4M带宽,由于bit和byte之间的转换,实际上理论传输速率为512KB/s

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号