【问题标题】:How would I limit upload and download speed from the server in golang?我将如何限制 golang 中服务器的上传和下载速度?
【发布时间】:2015-01-27 01:14:15
【问题描述】:

如何限制 golang 中服务器的上传和下载速度?

我正在编写一个 golang 服务器来允许用户上传和下载文件。文件很大,大约 1GB 字节。我想将上传和下载速度限制为(例如)1MB/s(当然可以配置)。

下面是我的上传代码:

func uploadFile(w http.ResponseWriter, r *http.Request) {
    file, _, err := r.FormFile("file")

    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    defer file.Close()

    os.MkdirAll(`e:\test`, os.ModePerm)
    out, err := os.Create(`e:\test\test.mpg`)
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    defer out.Close()

    _, err = io.Copy(out, file)
    if err != nil {
        http.Error(w, err.Error(), 500)
    }
}

【问题讨论】:

    标签: file-upload go download limit


    【解决方案1】:

    有一个token bucket 算法可以帮助实现这样的速率限制。我找到了一个示例实现,您可以使用它:https://github.com/juju/ratelimit

    package main
    
    import (
        "bytes"
        "fmt"
        "io"
        "time"
    
        "github.com/juju/ratelimit"
    )
    
    func main() {
        // Source holding 1MB
        src := bytes.NewReader(make([]byte, 1024*1024))
        // Destination
        dst := &bytes.Buffer{}
    
        // Bucket adding 100KB every second, holding max 100KB
        bucket := ratelimit.NewBucketWithRate(100*1024, 100*1024)
    
        start := time.Now()
    
        // Copy source to destination, but wrap our reader with rate limited one
        io.Copy(dst, ratelimit.Reader(src, bucket))
    
        fmt.Printf("Copied %d bytes in %s\n", dst.Len(), time.Since(start))
    }
    

    运行后,输出为:

    Copied 1048576 bytes in 9.239607694s
    

    您可以使用不同的存储桶实现来提供所需的行为。在您的代码中,设置正确的令牌桶后,您将调用:

    _, err = io.Copy(out, ratelimit.Reader(file, bucket))
    

    【讨论】:

    • 这可以限制文件写入速度,但我看到任务管理器的网络保持高速。我想限制网络数据传输速度。无论如何谢谢
    • 这是我的问题。我应该使用 r.MultipartReader() 和 reader.NextPart() 而不是 r.FromFile(),因为 r.FromFile() 会将数据保存在系统临时文件中。谢谢你!
    【解决方案2】:

    您可以查看PuerkitoBio/throttled 的实现,提供in this article

    throttled,一个 Go 包,它实现了各种策略来控制对 HTTP 处理程序的访问。
    开箱即用,它支持请求的速率限制、恒定的请求间隔流和内存使用阈值来授予或拒绝访问,但它还提供了扩展其功能的机制。 p>

    速率限制并不是您所需要的,但可以为implementing a similar feature 提供一个好主意。

    【讨论】:

    • 似乎是节流丢包而不是减慢传输速度……还是我遗漏了一些要点?
    • @Eric2201 六年后,我不太确定。不过当时它很有用。
    • @Eric2201 但是是的:github.com/throttled/throttled/blob/…。我可以看到这不是关于速度,而是更多关于限制请求。
    猜你喜欢
    • 2011-08-25
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多