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

已有196人围观 来源:程序员洋哥 发布于:2024-06-04 18:01:54

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

概述

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

分布式限流规则

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

  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 # 每次请求获取的令牌数

小结

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


© 2022-2024. All rights reserved. 梦想PHP.

声明:本站所有内容均为自动采集而来,如有侵权,请联系删除 苏ICP备06013646号-6