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——

往期推荐

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java 登陆拦截器_java 登录拦截器

    java 登陆拦截器_java 登录拦截器首先创建一个FilterServlet类下面代码packagecom.group.users.util;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.Se…

    2022年6月3日
  • WebGame开发过程中的一些思考和总结

    WebGame开发过程中的一些思考和总结WebGame如今已经很火,市场也很大,盛大和腾讯都已经看中这一块市场。我自己也在做这方面的研发,总结和思考一些问题。

    2022年5月29日
  • getParameter、getParameterValues、getParameterMap用法详解「建议收藏」

    getParameter、getParameterValues、getParameterMap用法详解「建议收藏」首先request中的参数parameter是一个map表,如下例(1)当调用getParameter(“hobby”)时只能获取hobby[0],即eat。(2)调用getParameterV

    2022年7月4日
  • idea 2021.10.3 激活码【2021最新】

    (idea 2021.10.3 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL5S9V8F-eyJsaWNlbnNlSWQiOi…

    2022年3月27日
  • 16 岁高中生成功将 Linux 移植到 iPhone,并贴出详细指南[通俗易懂]

    16 岁高中生成功将 Linux 移植到 iPhone,并贴出详细指南[通俗易懂]本文转载自InfoQ,作者李俊辰如果你的旧iPhone已经无法支持你日常使用了,你会怎么处理这部iPhone呢?卖掉还是留起来收藏呢?近日,国外一名16岁的小开发者在YouTube上发布了一则视频,展示了自己是如何将Linux移植到一部无法使用的iPhone7。2020年3月,Corellium提出了ProjectSandcastle,通过使用checkra1n越狱程序在iPhone上成功运行Android,激发了开发者对那些旧型号的iPhone.

    2022年9月25日
  • java笔试题库及答案,看完必懂

    java笔试题库及答案,看完必懂阿里面试总结1.一面首先确认对阿里的意向度;其次面试官会针对你曾经做过的项目来做具体技术的交流,你对项目细节是不是掌握到位,以及java技术基础和原理掌握程序,比如并发编程以及数据库和JVM三个方面,也会交流到分布式、线程池的实现等等(重点考察有没有深入钻研技术和技术上的亮点);2.二面技术面,根据项目深入的了解技术实力,了解你的知识面、问题解决能力以及技术灵活运用能力,也通过这一过程考察团队合作能力、学习主动性和创新性,可以挑选2-3个做过的有典型性的项目做一个仔细技术回顾和自己独到的理解(这是加

    2022年7月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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