服务接口的流量控制策略——分流、降级、限流。
为了防止客户端对于接口的滥用,保护服务器的资源,需要对服务器上的各种接口进行 调用次数的限制。服务接口的流量控制策略包括:分流、降级、限流。
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!