首页 > 编程语言 >BBR算法: 在Kratos的实现

BBR算法: 在Kratos的实现

时间:2024-10-20 22:11:13浏览次数:7  
标签:... Kratos 请求 BBR 算法 限流 使用率 CPU

什么是BBR?

BBR (Bottleneck Bandwidth and RTT) 最初是由Google开发的网络拥塞控制算法。在限流领域,BBR被改造用于自适应限流,通过动态调整并发请求数来平衡系统吞吐量和响应时间。

BBR限流算法的核心思想

BBR限流算法的核心思想是:

  1. 持续监控系统的关键指标(CPU使用率、请求通过量、响应时间)
  2. 根据这些指标动态计算系统的最大承载能力
  3. 当系统负载接近或超过这个能力时进行限流

Go语言实现分析

参考: Kratos的BBR实现

核心数据结构

type BBR struct {
    cpu             cpuGetter
    passStat        window.RollingCounter
    rtStat          window.RollingCounter
    inFlight        int64
    bucketPerSecond int64
    bucketDuration  time.Duration
    prevDropTime    atomic.Value
    maxPASSCache    atomic.Value
    minRtCache      atomic.Value
    opts            options
}
  • cpu​: 获取CPU使用率的函数
  • passStat​: 统计通过请求数的滑动窗口
  • rtStat​: 统计响应时间的滑动窗口
  • inFlight​: 当前处理中的请求数
  • bucketPerSecond​: 每秒的桶数
  • bucketDuration​: 每个桶的持续时间
  • prevDropTime​: 上一次开始丢弃请求的时间
  • maxPASSCache​: 缓存最大通过请求数
  • minRtCache​: 缓存最小响应时间

初始化

func NewLimiter(opts ...Option) *BBR {
    // ... 初始化代码
}

这个函数创建并初始化一个BBR限流器实例。它设置默认选项,创建滑动窗口计数器,并初始化CPU使用率获取函数。

关键方法实现

maxPASS(): 计算最大通过请求数

func (l *BBR) maxPASS() int64 {
    // ... 计算逻辑
}

这个方法计算在一个时间窗口内能够成功处理的最大请求数。它使用缓存来优化性能,并通过遍历滑动窗口找出最大的通过请求数。

3.3.2 minRT(): 计算最小响应时间

func (l *BBR) minRT() int64 {
    // ... 计算逻辑
}

这个方法计算系统处理请求的最短时间。它同样使用缓存优化,并通过遍历滑动窗口计算每个桶的平均响应时间,然后找出最小值。

maxInFlight(): 计算最大并发请求数

func (l *BBR) maxInFlight() int64 {
    return int64(math.Floor(float64(l.maxPASS()*l.minRT()*l.bucketPerSecond)/1000.0) + 0.5)
}

这个方法计算系统在保持最佳性能的同时可以同时处理的最大请求数。它结合了最大通过量、最小响应时间和每秒的桶数来计算。

shouldDrop(): 判断是否应该限流

func (l *BBR) shouldDrop() bool {
    // ... 判断逻辑
}

这个方法决定是否应该丢弃当前请求。它首先检查CPU使用率是否超过阈值。如果CPU使用率低,它会检查是否刚开始丢弃请求。如果CPU使用率高,它会检查当前并发请求数是否超过最大允许值。

Allow(): 限流器的主要入口

func (l *BBR) Allow() (ratelimit.DoneFunc, error) {
    // ... 限流逻辑
}

这是BBR限流器的主要入口。它首先调用shouldDrop()​来决定是否应该丢弃请求。如果不丢弃,它会增加inFlight​计数,并返回一个DoneFunc​,用于在请求完成时更新统计信息。

CPU使用率监控

func cpuproc() {
    // ... CPU使用率监控逻辑
}

这个函数在后台持续运行,每500毫秒采样一次CPU使用率,并使用指数移动平均(EMA)算法更新全局CPU使用率变量。

BBR的工作流程

  1. 系统持续监控CPU使用率、请求通过量和响应时间。
  2. 当新请求到来时,Allow()​方法被调用。
  3. Allow()​调用shouldDrop()​来决定是否应该限流。
  4. shouldDrop()​首先检查CPU使用率,然后比较当前并发请求数与maxInFlight()​。
  5. 如果决定不限流,请求被允许通过,并增加inFlight​计数。
  6. 请求处理完成后,调用返回的DoneFunc​来更新统计信息。

BBR的优势

  1. 自适应: 根据实时系统性能动态调整限流策略。
  2. 多维度保护: 同时考虑CPU使用率、请求量和响应时间。
  3. 高效: 使用滑动窗口和原子操作,保证高并发下的性能。
  4. 精确控制: 通过精确计算最大并发请求数,实现细粒度的限流。

使用BBR的注意事项

  1. 合理设置CPU使用率阈值: 这直接影响限流的触发时机。
  2. 调整滑动窗口大小: 影响统计的精度和实时性。
  3. 监控和调优: 在实际使用中需要持续监控系统性能,并根据需要调整参数。

标签:...,Kratos,请求,BBR,算法,限流,使用率,CPU
From: https://www.cnblogs.com/pDJJq/p/18488034/bbr-algorithm-the-implementation-of-kratos-1nvlj9

相关文章

  • 基于模糊控制算法的倒立摆控制系统simulink建模与仿真
    1.课题概述      对倒立摆模型进行模糊控制器simulink建模,利用倒立摆的摆角角度与小车的位置来控制小车的推力,控制了倒立摆的摆角问题,使得小车最终停在稳定的位置。 2.系统仿真结果                                        ......
  • 算法笔记-字符串算法集合(未完)
    这里有一些别样的学习思路。KMP用途模式串匹配过程我们分解\(O(nm)\)的算法过程。如图,红色竖线包括的为目前匹配成功的部分,对于下一位\(i\):首先,如果成功匹配,那么匹配长度加一。否则,我们考虑失配情况。我们会将\(S\)串的匹配部分左端点向右移动一位,然后\(T\)串......
  • 基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频)a=2*(1-(t/Iters));fori=1:Numforj=1:dimr1=rand;r2=......
  • 代码随想录算法训练营 | 739. 每日温度,496.下一个更大元素 I ,503.下一个更大元素II
    739.每日温度题目链接:739.每日温度文档讲解︰代码随想录(programmercarl.com)视频讲解︰每日温度日期:2024-10-20想法:遍历一遍数组,用栈来存数组下标做记录,因为要找更高得温度,当当前遍历的温度大于栈头存储(存的下标)的温度时,就可以知道栈头要过多少天遇到高温,低的时候直接入栈。J......
  • 七、朴素贝叶斯算法
    朴素贝叶斯算法前言一、概念二、贝叶斯定理三、朴素贝叶斯分类器四、训练过程第一步:计算计算先验概率第二步:计算条件概率五、模型预测六、常见变体6.1高斯朴素贝叶斯(GaussianNaiveBayes):6.2多项式朴素贝叶斯(MultinomialNaiveBayes):6.3伯努利朴素贝叶斯(BernoulliNa......
  • 快速幂算法
    如何计算,(n是正整数),只需要将a*a*a*a......*a,但它的时间复杂度为O(n)。有什么办法可以快速解决这个问题,比如说:先通过:这个算法的本质是倍增原理比如说,105=1+8+32+64,所以可以写成,将它展开由于很容易计算,所以只需要将它们相乘就可以,但具体是如何实现的可以看见105的二......
  • 动态分层强化学习(DHRL)算法
    动态分层强化学习(DHRL)算法详解一、引言在强化学习(ReinforcementLearning,RL)领域,面对复杂、大规模的任务,传统方法往往面临诸多挑战,如高维度状态空间导致的“维数灾难”、长期依赖与稀疏奖励等问题。为了克服这些挑战,分层强化学习(HierarchicalReinforcementLearning,HR......
  • 微信小程序毕业设计-基于springboot+协同过滤推荐算法的成都美食分享系统设计和实现,基
    博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业......
  • 数据结构与算法
    数据结构:研究数据在内存中存储的结构算法:实现增删改查的方法解决问题的实际方法算法的好坏评价标准:时间复杂度和空间复杂度时间复杂度:算法所用时间的一个映射时间复杂度得出的是一个数学问题数据总量x(x足够大),从而消耗的执行次数y之间存在的关系LeetCode算法题......
  • 【多种改进粒子群算法进行比较】基于启发式算法的深度神经网络卸载策略研究【边缘计算
    ......