服务接口的流量控制策略——分流、降级、限流。

为了防止客户端对于接口的滥用,保护服务器的资源,需要对服务器上的各种接口进行 调用次数的限制。服务接口的流量控制策略包括:分流、降级、限流。

3 限流

https://zhuanlan.zhihu.com/p/273486885?utm_source=wechat_session

3.1 漏斗算法

https://blog.csdn.net/swadian2008/article/details/123723984
https://www.zhihu.com/topic/20430306/top-answers

算法思想:请求先进入到漏桶,漏桶以固定的速度出水(处理请求),当水加的过快(请求速率太高),则会溢出(拒绝请求)。
该算法有 2 个变量,一个变量是桶的大小,代表业务能够接受请求被处理的最大等待时间;一个变量是水桶漏洞的大小(服务器处理请求的速率)。
由于漏桶的漏出速率是固定的参数,因此漏桶算法的特点是(1)强行限制数据的传输速率;(2)对于存在突发特性的流量缺乏效率
对于不仅需要限制数据的平均传输速率,还需要允许某种程度的突发传输,漏桶算法不合适。【令牌桶算法更为合适】

3.2 令牌桶算法

算法思想:令牌桶算法的原理是系统以一个恒定的速度往桶里放入令牌。如果请求需要被处理,则需要先从桶里获取一个令牌。若桶里无令牌可取,则拒绝服务。【思路与桶算法完全相反】
优点:可以方便改变响应请求的速率。

实战:多源智能融合项目的令牌桶使用
(1)需求分析:实际环境里有多个客户端,每个客户端都会频繁向后台发送本地环境照片,并请求后台对环境照片进行相应的处理。由于每个请求都需要调用深度模型进行处理,服务器响应请求的速率较慢,因此有必要使用 令牌桶 技术进行限流。

相关代码如下:

def can_pass_token_bucket(rate=0.5, capacity=30):
    """
    :param time_zone: 接口限制的时间段
    :param times: 限制的时间段内允许多少请求通过
    """
    # 请求来了就倒水,倒水速率有限制
    key = "Interface1"
    rate = rate
    capacity = capacity
    tokens = redis_db.hget(key, 'tokens')  # 看桶中有多少令牌
    last_time = redis_db.hget(key, 'last_time')  # 上次令牌生成时间
    now = time.time()
    tokens = int(tokens) if tokens else capacity
    last_time = int(last_time) if last_time else now
    delta_tokens = (now - last_time) * rate  # 经过一段时间后生成的令牌
    if delta_tokens >= 1:
        tokens = tokens + delta_tokens  # 增加令牌
        if tokens > capacity:
            tokens = capacity

        last_time = time.time()  # 记录令牌生成时间
        redis_db.hset(key, 'last_time', last_time)

    if tokens >= 1:
        tokens -= 1  # 请求进来了,令牌就减少1
        redis_db.hset(key, 'tokens', tokens)
        return True
    return False
posted @   MasterBean  阅读(1046)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示