Как я могу ограничить скорость загрузки и загрузки с сервера в golang?
Как я могу ограничить скорость загрузки и загрузки с сервера в golang?
Я пишу сервер golang, чтобы пользователи могли загружать и скачивать файлы. И файл большой, около 1GB байт. Я хочу ограничить скорость загрузки и загрузки (например) 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:testtest.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)
}
}
2 ответов
здесь 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))
вы можете проверить реализацию PuerkitoBio/throttled
, представленного в этой статье:
throttled
, пакет Go, реализующий различные стратегии управления доступом к обработчикам HTTP.
Из коробки, он поддерживает