Golang — использование rate limiter в коде

Rate limiting — ограничение скорости запросов в определенной системе. К примеру вы можете поставить ограничения на ваш веб сервер — не более 10 запросов в секунду. Возможно создание ограничения только для определенного клиента или типа машины.

В Golang добавление rate limit довольно просто, достаточно использовать готовую библиотеку golang.org/x/time/rate

Как пример — я хочу получать не более 10 запросов в секунду с первоначальным burst (довольно сложно перевести на русский, что-то типа вспышки или очереди запросов) в 100:

package main

import (
	"context"
	"fmt"
	"time"

	"golang.org/x/time/rate"
)

func main() {
  limit := 10
  burst := 100
  limiter := rate.NewLimiter(rate.Limit(limit), burst)
  ctx := context.Background()
  i := 0
  for {
    fmt.Println("Do smth...", time.Now())
    limiter.Wait(ctx)
    fmt.Println(i, " - ", time.Now())
    i++
  }
}

Итого, при запуске я получу 100 Do smth.. немедленно и далее следующие запросы будут идти пачками по 10 штук в секунду.

Мы также можем сбросить burst или изменить это значение во время исполнения программы.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *