当前位置:首页 > 技术文章 > 常见分布式限流方案,你知道几种?

常见分布式限流方案,你知道几种?

go1238个月前 (06-04)技术文章380

限流是在高并发业务场景下,超过系统处理能力后,为确保系统稳定性和可用性所采取的技术手段。在分布式系统中,面对大数据量的高并发访问请求时,需要一种方法来控制每个请求的访问频率,以避免过多的请求导致系统负载过高或崩溃。

在分布式系统中,高并发的访问请求是常态。为了保护系统不受过载的影响,确保系统的稳定性和可用性,限流成为了一项不可或缺的技术手段。

概述

限流是在高并发业务场景下,超过系统处理能力后,为确保系统稳定性和可用性所采取的技术手段。在分布式系统中,面对大数据量的高并发访问请求时,需要一种方法来控制每个请求的访问频率,以避免过多的请求导致系统负载过高或崩溃。

分布式限流规则

限流通常是对时间和资源两个维度的限制,常见的限流规则包括:

  1. 1. 基于QPS和连接数控制:根据每个节点的QPS和连接数来设定限流值。

  2. 2. 基于传输速率限制:通过限制每个请求的传输速率来控制请求的速率。

  3. 3. 基于IP纬度限制:根据每个请求的IP地址进行限流。

  4. 4. 基于服务器限制:根据每个请求所访问的服务器来进行限流。

  5. 5. 黑白名单限制:将拒绝请求的理由设置为黑名单,将允许请求的理由设置为白名单。

分布式限流方案

客户端限流

客户端限流是一种简单有效的方式,例如12306抢票的验证码限制,通过在前端增加验证访问达到限制流量的目的。

网关层限流策略

服务网关作为分布式链路的第一道关卡,承接了所有的用户请求。在网关层做好流量的控制后,将极大的降低后端服务层的压力。常用的网关实现可以使用Nginx、Spring Cloud Gateway等。

基于中间件的限流策略

可以使用中间件比如Redis实现服务层的限流策略,利用Redis脚本化编程能力将限流模块和业务功能解耦,以及Redis高并发特性和高可用架构实现稳定的中间件层限流机制。

基于限流组件实现限流

一些开源的限流组件如阿里的Sentinel可以实现限流功能。

分布式限流常用算法

计数器限流算法

计数器限流算法是一种简单而有效的限流方案,它通过为每个请求分配一个计数器,当计数器达到一定值时,限制请求的处理速率或拒绝请求。

滑动窗口限流算法

滑动窗口限流算法通过维护一个滑动窗口来限制请求的处理速率,可以保证任意时间窗口内,都不会超过最大允许的限流值。

漏桶限流算法

漏桶限流算法可以理解为注水漏水的过程,往漏桶中以任意速率流入水,以固定的速率流出水。

令牌桶限流算法

令牌桶算法是对漏桶算法的一种改进,不仅能够平滑限流,还允许一定程度的流量突发。

分布式限流实现方案

使用Nginx实现

Nginx可以使用类似限流器的模块实现分布式限流,可以在每个进程或子进程上限制每个连接的访问速率或者控制并发连接数。

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;

server {
    location / {
        limit_req zone=api_read burst=100;
        limit_conn perip_conn 50;
        limit_conn perserver_conn 200;
    }
}

使用Redis实现

Redis+Lua脚本可用于实现高并发和高性能的流量限制。

local key = KEYS[1]
local limit = tonumber(ARGV[1])

local currentLimit = tonumber(redis.call('get', key) or "0")

if currentLimit + 1 > limit then
    return 0
else
    redis.call("INCRBY", key, 1)
    redis.call("EXPIRE", key, 2)
    return 1
end

使用Spring Cloud Gateway实现

Spring Cloud Gateway提供了一个自实现的限流过滤器RequestRateLimiterGatewayFilterFactory,这个过滤器里面有两个参数:一个是KeyResolver,还有一个是RateLimiter,采用的是令牌桶算法实现。

- id: server2
  uri: lb://eureka-server1
  predicates:
    - Path=/server1/test
  filters:
    - name: RequestRateLimiter
      args:
        key-resolver: "#{@hostAddrKeyResolver}"
        redis-rate-limiter.replenishRate: 1 # 令牌桶填充的速率 秒为单位
        redis-rate-limiter.burstCapacity: 1 # 令牌桶总容量
        redis-rate-limiter.requestedTokens: 1 # 每次请求获取的令牌数

小结

分布式限流是确保系统稳定性和可用性的关键技术。通过上述介绍的限流方案和算法,你可以根据自己的业务需求选择合适的限流策略。


声明:本站所有内容均为自动采集而来,如有侵权,请联系删除

相关文章

Redis连环五十二问!看谁顶得住?

Redis连环五十二问!看谁顶得住?

基本 1.说说什么是Redis? Redis是一种基于键...

用 PHP 处理 10 亿行数据!

用 PHP 处理 10 亿行数据!

今天,我将带大家一起走进“挑衅十亿行“数据的世界。当然,这个事情是依据GitHub上的一个“十亿行挑衅”(1brc)运动而来,现在正在进行,如果你没有听说过,可查看Gunnar Morlings 的 1brc 存储库。https://github.com/gunnarmorling/1brc我之所以...

2024 年的最佳 PHP 框架

2024 年的最佳 PHP 框架

在本文中,我们将预测在 2024 年持续风行的最佳 PHP 框架。我们首先将看看PHP框架是什么,什么时候该斟酌应用PHP框架,以及应用PHP框架的重要长处都是什么。我还会介绍最合适初学者的 PHP 框架以及用于 Web 开发的最佳框架。什么是PHP框架?     &...

一文读懂多家厂商的大模型训练、推理、部署策略

一文读懂多家厂商的大模型训练、推理、部署策略

4 月 20 日,第 102 期源创会在武汉胜利举行。本期邀请来自武汉人工智能研讨院、华为、MindSpore、京东云、Gitee AI 的人工智能专家,环绕【大模型竞技与性能优化】主题发表演讲。接下来就一起看看本期运动的出色瞬间吧!大合影 get ✅披萨和礼物不能少!接下来进入主题演讲回想环节。可...

请立刻停止编写 Dockerfiles 并使用 docker init

请立刻停止编写 Dockerfiles 并使用 docker init

您是那种认为编写 Dockerfile 和 docker-compose.yml 文件很苦楚的人之一吗?我承认,我就是其中之一。我总是想知道我是否遵守了 Dockerfile、 docker-compose 文件的最佳编写实践,我畏惧在不知不觉中引入了安全破绽。但是现在,我不必再担忧这个问题了,感激...

服务器为什么大多用 Linux 而不是 Windows ?

服务器为什么大多用 Linux 而不是 Windows ?

前几天在知乎看到一个话题很有意思,且很有讨论意义。“服务器为什么大多用 Linux”,除了开源、好用等原因,回答也代表了各种不同人需求和看法,摘取一些分享给大家,也欢迎留言讨论。来自知乎好友“熊大你又骗俺”的回答首先在20年前,windows server+iis+asp+access 的方案,还是...