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
限速的话,一般用令牌桶。专门起个微服务,发令牌就行了。
更多关于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中,实现类似百度网盘针对账号的限速功能,通常涉及流量控制和速率限制策略。以下是一些实现账号限速的常用方法:
-
令牌桶算法:
- 以限速速度均匀向桶中放置令牌。
- 处理限速操作时,先请求令牌桶服务,获得令牌则正常处理,未获得则等待或返回错误。
- 令牌桶遇到请求量突增时会短暂超过实际限速,因为桶有一定容量。
-
漏桶算法:
- 匀速“漏”出令牌(或处理请求)。
- 与令牌桶不同,漏桶算法在请求量突增时不会短暂超过限速,而是会排队等待。
-
基于时间周期的限速器:
- 使用
time.Ticker
或time.AfterFunc
等定时器机制,控制单位时间内的请求量。 - 例如,可以设置每秒允许通过的请求数,当达到限制时,后续请求将被延迟或拒绝。
- 使用
-
Redis限速:
- 利用Redis记录账号的请求时间和次数。
- 通过判断请求时间间隔和次数,决定是否允许当前请求。
- 这种方法适用于需要对用户行为进行详细记录和控制的场景。
在实现过程中,还需考虑并发控制和线程安全等问题,以确保限速功能的稳定性和可靠性。同时,针对不同类型的限速需求(如QPS限速、带宽限速等),可以选择合适的算法和策略进行实现。