Golang Go语言中类似百度网盘针对账号限速是怎么实现的呢?

Golang Go语言中类似百度网盘针对账号限速是怎么实现的呢?

比如单账号限制是 100kb/s 。 如果下载一个文件,那么下载速度就为 100kb/s 如果同时下载 10 个文件,那么下载速度就平均成为了 10kb/s

但是我看 go 语言 golang.org/x/time/rate 等别的限速库都是针对单 tcp 连接限速的。 不太清楚怎么根据建立的连接数实时改变每个连接的下载速度


更多关于Golang Go语言中类似百度网盘针对账号限速是怎么实现的呢?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

限速的话,一般用令牌桶。专门起个微服务,发令牌就行了。

更多关于Golang Go语言中类似百度网盘针对账号限速是怎么实现的呢?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


数据分块,当前块儿速度不受影响。在下载下一块儿数据,建立连接时做限速。(我瞎猜的

计算机网络第七版,第九章 qos 一节

自己写过一个单机令牌桶限速 https://github.com/eudore/eudore/blob/master/_example/middlewareRateSpeed.go#L16

这种我猜 iphash 使用一个机器处理,然后设置自定义 key 返回 userid 作为限速 key,分布式下限速想不出来。

问了我旁边同事,多入口的情况下限制下载连接数量,限制每个连接的速度为 500k,限速 1m 就限制 2 个下载请求,不管重请求从那个流量入口进去,通过分布式锁锁定下载请求数完成。

在Golang中,实现类似百度网盘针对账号的限速功能,通常涉及流量控制和速率限制策略。以下是一些实现账号限速的常用方法:

  1. 令牌桶算法

    • 以限速速度均匀向桶中放置令牌。
    • 处理限速操作时,先请求令牌桶服务,获得令牌则正常处理,未获得则等待或返回错误。
    • 令牌桶遇到请求量突增时会短暂超过实际限速,因为桶有一定容量。
  2. 漏桶算法

    • 匀速“漏”出令牌(或处理请求)。
    • 与令牌桶不同,漏桶算法在请求量突增时不会短暂超过限速,而是会排队等待。
  3. 基于时间周期的限速器

    • 使用time.Tickertime.AfterFunc等定时器机制,控制单位时间内的请求量。
    • 例如,可以设置每秒允许通过的请求数,当达到限制时,后续请求将被延迟或拒绝。
  4. Redis限速

    • 利用Redis记录账号的请求时间和次数。
    • 通过判断请求时间间隔和次数,决定是否允许当前请求。
    • 这种方法适用于需要对用户行为进行详细记录和控制的场景。

在实现过程中,还需考虑并发控制和线程安全等问题,以确保限速功能的稳定性和可靠性。同时,针对不同类型的限速需求(如QPS限速、带宽限速等),可以选择合适的算法和策略进行实现。

回到顶部