一尘不染

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

go

在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)
    }
}

阅读 436

收藏
2020-07-02

共1个答案

一尘不染

有一个令牌桶算法可以帮助实现这样的速率限制。我找到了一个示例实现,您可以使用它: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))
2020-07-02