分布式限流方案及实现

这篇具有很好参考价值的文章主要介绍了分布式限流方案及实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

优质博文:IT-BLOG-CN

一、限流的作用和意义

限流是对高并发访问进行限制,限速的过程。通过限流来限制资源,可以提高系统的稳定性和可靠性,控制系统的负载,削峰填谷,保证服务质量。

服务限流后的常见处理方式:
【1】拒绝服务;
【2】排队或等待;
【3】服务降级(当服务器压力剧增的情况下,根据当前业务情况及流量对一些非核心服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行);

二、限流的主要方式

限流可以分为两大类:
【1】单机限流:计数器、互动窗口、漏桶算法、令牌桶算法;

计数器: 取固定大小的时间窗口,并在每个窗口时间内限制请求数量。只需要记录一个计数器,并在每个时间窗口结束时将其重置为零。每当请求进入系统时,我们都会将计数器加一,并检查它是否超过了限制的阈值。这种方式的缺点是:窗口是固定的,在两个窗口边界会有流量超限问题。
分布式限流方案及实现,分布式服务框架,分布式

滑动窗口: 滑动窗口的基本思想是在固定窗口基础之上,将一个窗口分为若干个等分的小窗口,每个小窗口对应不同的时间点,拥有独立的计数器。当请求的时间点大于当前窗口的最大时间点时,则将窗口向前平移一个小窗口。如果请求数量超过了小窗口的限制的阈值,则决绝该请求。时间区间精度越高,所需空间容量越大。每一次小窗口就判断是否超过1分钟的阈值,取当前小窗口的前后五分钟的请求量,例如下图虚线框部分。提高了限流的频率和准确性。
分布式限流方案及实现,分布式服务框架,分布式

漏桶算法: 可粗略的认为就是注水漏水的过程,往桶中以任意流速流入水,以一定速率流出水,当水超过桶容量则触发限流,因为出水速率是不变的,所以保证了资源的请求速率。漏桶算法是一个强制限制请求速率的方式,有两个缺点:
 ● a)无法应对正常的突发流量:实际上突发一波请求流量是正常现象。漏桶算法中的漏桶容易被突发流量打满,导致后续的正常请求被限流。
 ● b)无法有效利用资源:严格限制请求量,无法充分利用资源。
分布式限流方案及实现,分布式服务框架,分布式

令牌桶算法: 令牌桶算法是对漏桶算法的改进,能在限制调用的平均速率的同时还允许一定程度的突发调用。
限流过程:
 ● a)系统以恒定的速率产生令牌,然后将令牌放入令牌桶中;
 ● b)令牌桶有容量限制;
 ● c)每次请求需要从令牌桶中获取令牌,有令牌则提供法务,无令牌则拒绝服务;
分布式限流方案及实现,分布式服务框架,分布式

令牌桶算法一定程度上可以防止突发流量,以每分钟100请求量为例,如果前一分钟使用了90个令牌,则当前就可以使用110个令牌容量,来处理突发请求。作为漏桶算法的改进,令牌桶算法在限流场景下被广泛使用。
Guava为我们提供了很好的基于令牌桶算法的流控工具RateLimiter,可以支持突发流量也可以支持预热等多种功能,简单好用。

【2】分布式限流:Redis令牌桶、发票服务器Sentinel

三、单机限流 VS 分布式限流

【1】单机限流在单机上运行性能好,状态稳定。但如果分布式系统使用单纯的单机限流,开启HPA后流量会处于半失控状态,如果扩容整个集群限流就会变大,缩容整个集群限流就会变小。
【2】已有的分布式限流方案需要每次/每批请求都需要请求“阈值管理者”单点,增加了服务端的网络开销和不稳定因素,“阈值管理者”的稳定性也是影响结果的一个重要因素。
【3】如果能结合单机限流和分布式限流的优点,就是我们这次需要的分布式限流框架。

四、聚合查询限流场景

场景: 请求量大且调用方多:10000+渠道,平均QPS5000+

为什么需要限流:
【1】请求流量不稳定:存在突发流量(爬虫、活动);
【2】资源有限:部分底层资源不能抗衡突发流量(第三方接口),部分资源收费;
【3】业务要求:业务合同原因(甲方产品有限),需要限制调用方请求数;

为什么不能使用公司接口框架自带的限流功能: 因为相同调用方拥有多个销售渠道,存在不同销售渠道流量限制不同的场景,框架自带服务ID和操作OP的限流维度不能满足需求。

核心主流程: 需要保证响应速度和稳定性。

限流配置经常调整。

聚合层限流服务

限流功能主要基于RateLimiter高效可靠。由限流服务端更新推送限流资源配置,监听客户端状态。这种方案结合了单机限流和分布式限流的优点。

以下面场景说明限流服务工作过程:
【1】限流Clinet初始化: 引入限流Client的应用启动时,限流Client将初始化Client自动从限流服务端获取全量的单机限流参数,根据不同资源名初始化不同的RateLimiter并存入缓存;
分布式限流方案及实现,分布式服务框架,分布式

【2】Client限流过程: 限流Client初始化后,业务服务端正常运行时,限流Client以单机令牌桶限流的方式进行限流,和限流服务端无交互,减少不必要的调用和依赖;
分布式限流方案及实现,分布式服务框架,分布式

【3】修改限流配置: 修改配置时,限流服务端通过消息通知所有Client更新限流参数;
分布式限流方案及实现,分布式服务框架,分布式

【4】被限流的服务集群状态变更: 业务服务端实例发生变更时(扩缩容、拉入拉出等),限流服务端监听注册中心实例变更消息并重新计算限流值,通知限流Client更新限流;
分布式限流方案及实现,分布式服务框架,分布式

【5】Client定期同步配置: 限流组件Client也会定期从限流服务端拉取最新的限流配置,保证使用数据的新鲜度;
分布式限流方案及实现,分布式服务框架,分布式

功能

【1】支持多种资源名称配置维度,例如渠道、子渠道等,且可以自定义多种限流维度。
【2】支持将限流值配置至Group维度,使不同Group使用不同的限流值。

优化点

目前组件的限流功能依赖于负载均衡,需要优化在负载不均衡的情况。将结合其他限流方案进行优化。文章来源地址https://www.toymoban.com/news/detail-619341.html

到了这里,关于分布式限流方案及实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 redis 实现分布式接口限流注解 RedisLimit

    前言 很多时候,由于种种不可描述的原因,我们需要针对单个接口实现接口限流,防止访问次数过于频繁。这里就用 redis+aop 实现一个限流接口注解 @RedisLimit 代码 点击查看RedisLimit注解代码 AOP代码 点击查看aop代码 lua脚本代码 注意:脚本代码是放在 resources 文件下的,它的类型是

    2024年02月08日
    浏览(59)
  • SpringBoot第22讲:SpringBoot如何实现接口限流之分布式

    上文中介绍了单实例下如何在业务接口层做限流,本文是SpringBoot第22讲,主要介绍分布式场景下限流的方案, 以及什么样的分布式场景下需要在业务层加限流而不是接入层 ; 并且结合 开源的ratelimiter-spring-boot-starter 为例,作者是kailing, 学习 思路+代码封装+starter封装 。

    2024年02月13日
    浏览(41)
  • 微服务---分布式多级缓存集群实现方案(Caffeine+redis+nginx本地缓存+Canal数据同步)

    传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻T

    2024年02月12日
    浏览(41)
  • 分布式服务框架_Zookeeper--管理分布式环境中的数据

    安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础,最新的版本可以通过官网   http://hadoop.apache.org/zookeeper/ 来获取, Zookeeper 的安装非常简单,下面将从单机模式和集群模式两个方面介绍 Zookeeper 的安装和配置。 单机模式

    2024年02月12日
    浏览(42)
  • zookeeper —— 分布式服务协调框架

    Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已

    2024年02月07日
    浏览(44)
  • [分布式]-限流熔断降级

    限流,顾名思义,限制系统的流量,防止用户过多地访问系统的资源,甚至是恶意地访问,比如恶意爬虫,DDOS 等;同时也防止系统承载过多流量而崩溃,从而对系统运行资源做到一个有效的管理 在分布式系统中,节点之间需要相互调用,如果调用链中一个节点宕机,将会导

    2024年02月09日
    浏览(40)
  • 分布式限流:Redis

    目录 1:如何实现分布式限流 2:限流的几种类别  2.1:固定窗口限流 2.2:滑动窗口限流 2.3:漏桶限流 2.4:令牌桶限流 3:实现分布式限流:Redis 3.1:引入Redisson的依赖包 3.2:初始化Redisson 3.3:创建Redisson的限流类  1:把统计用户的使用频率等这些数据放到一个集中的存储,比如redis,这样无

    2024年02月08日
    浏览(45)
  • 分布式限流和本地限流那些事?

    分布式限流和本地限流的目的是一样的,当然我建议技术人在自己的服务中优先考虑本地限流,那样对于自己的API的影响会小一点。 限流这种技术,在没有触发限流的阈值的时候,是不会有什么大的问题的,当时一旦触发阈值,然后在处理限流逻辑的过程中就容易出现问题。

    2024年02月02日
    浏览(40)
  • Dubbo——微服务框架(单体式->分布式->微服务)

    Dubbo是阿里巴巴开源的基于Java的高性能RPC(一种远程调用)分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。; 每天为2千多个服

    2024年02月05日
    浏览(37)
  • 分布式核心知识以及常见微服务框架

     分布式中的远程调用 在微服务架构中,通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分:序列化和通信协议。常见的序列化协议包括json、xml、 hession、 protobuf、thrift、text、 bytes等,目前主流的远程调用技术有基于HTTP的RESTful接口以及基于TCP的RPC协议。

    2024年02月11日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包