qps流量控制-令牌桶算法

一般并发系统有对应处理请求的最大能力,这里称最大qps,也需要有阈值设置,如果超过最大qps,则可能导致系统不稳定,产生雪崩效应,甚至连锁反应。

限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已达到保护系统的目的。一般来说系统的吞吐量是可以被测算的,为了保证系统的稳定运行,一旦达到的需要限制的阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:部分拒绝处理。

 

令牌桶算法

  令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 当桶满时,新添加的令牌被丢弃。

令牌桶是一个存放固定容量令牌(token)的桶,按照固定速率往桶里添加令牌。令牌桶算法基本可以用下面的几个概念来描述:

  • 令牌将按照固定的速率被放入令牌桶中。比如每秒放10个。
  • 桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃。
  • 当1个请求到达,如果桶中还有令牌,将从桶中删除1个令牌,接着请求会被处理。
  • 如果桶中的令牌不足1个,则不会给该请求分发令牌,该请求会被直接返回,日志记录该请求超阈值。

令牌桶c++实现:https://github.com/phlamenco/boully.git

代码转自:https://www.jianshu.com/p/6f9e24f4394a

### 令牌桶算法与漏桶算法的区别 #### 基本概念 令牌桶算法是一种基于时间间隔生成固定数量令牌的机制,只有获取到令牌才能发送数据包[^2]。相比之下,漏桶算法通过以恒定速率从桶中移除数据来控制流量输出[^1]。 #### 流量控制特性 - **令牌桶算法**:除了能限制数据的平均传输速率之外,还可以支持一定程度上的突发传输行为。当令牌桶中有足够的令牌时,可以一次性消耗多个令牌完成一次较大的数据爆发传输操作[^3]。 - **漏桶算法**:严格按设定的速度向外“漏水”,即流出数据包,无法适应瞬时高需求场景下的快速响应要求[^4]。 #### 效率对比 在面对具备突发特征的数据流时,由于漏桶采用的是均匀释放策略,即便当前网络环境良好也难以充分利用带宽资源;而令牌桶则因其灵活性,在不影响整体吞吐能力的前提下更好地满足了这类特殊业务的需求特点。 ### 应用场景分析 | 场景描述 | 推荐使用的算法 | | --- | --- | | 需要精确控制每秒发出请求次数的应用服务接口调用频率管理 | 漏桶更适合这种情况,因为它提供了更加稳定和平滑的服务质量保障效果 .<br>例如API网关中的QPS限流功能通常会选择这种方式实现.| | 对于那些偶尔会出现短时间内的访问高峰但总体上仍需维持一定水平性能表现良好的在线视频播放平台或者文件下载站点等 | 这种情形下应该优先考虑使用令牌桶方案 ,因为其允许合理范围内的速度波动从而提高用户体验满意度 同时又能有效防止过载现象发生.<br>比如P2P下载工具内部可能会运用此类技术优化节点间资源共享效率 .| ```python # 示例代码展示如何模拟简单的令牌桶逻辑 class TokenBucket: def __init__(self, rate, capacity): self.rate = rate # 单位时间内产生的token数 self.capacity = capacity # token桶的最大容量 self.tokens = capacity # 初始化满额tokens self.timestamp = time.time() # 记录上次更新的时间戳 def consume(self, tokens_needed): now = time.time() elapsed_time = now - self.timestamp new_tokens = elapsed_time * self.rate # 根据过去经过时间和生产速率计算新增加的数量 self.tokens += new_tokens # 更新现有总量 self.tokens = min(self.capacity, self.tokens) # 不超过最大限额 if self.tokens >= tokens_needed: # 如果有足够的token可用,则消费并返回True表示成功 self.tokens -= tokens_needed self.timestamp = now # 刷新最后修改时刻 return True else: # 反之失败 return False ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值