Как ограничить скорость загрузки и загрузки с сервера в golang?

Как ограничить скорость загрузки и загрузки с сервера в golang?

Я пишу сервер golang, чтобы пользователи могли загружать и скачивать файлы. И файл большой, около 1 Гбайт байт. Я хочу ограничить скорость загрузки и загрузки до (например) 1 МБ/с (настраивается, конечно).

ниже - мой код загрузки:

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

Ответ 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))

Ответ 2

Вы можете проверить реализацию PuerkitoBio/throttled, представленную в этой статьи:

throttled, пакет Go, который реализует различные стратегии для контроля доступа к обработчикам HTTP.
Внекорпоративный сервер поддерживает ограничение скорости запросов, поток запросов на запросы и пороги использования памяти с постоянным интервалом для предоставления или запрещения доступа, но также предоставляет механизмы для расширения его функциональности. p >

Ограничение скорости не совсем то, что вам нужно, но может дать хорошую идею для реализации аналогичной функции.