0Pricing
Go Academy · Урок

golang.org/x/time/rate

Используйте ограничитель частоты

«golang.org/x/time/rate» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Пакет rate

golang.org/x/time/rate предоставляет готовый к использованию в production ограничитель Limiter на основе корзины токенов. Это стандартный выбор для ограничения частоты в Go.

  • Проверенная на практике реализация
  • Методы Allow, Wait и Reserve
  • Учитывает контекст

Создание ограничителя

rate.NewLimiter принимает скорость (число токенов в секунду) и размер всплеска. rate.Limit — это значение float64, обозначающее число событий в секунду.

limiter := rate.NewLimiter(rate.Limit(10), 5)

rate.Every

Если Вам удобнее мыслить интервалами, а не скоростью в секунду, rate.Every преобразует длительность в скорость. Одно событие каждые 200 мс соответствует пяти событиям в секунду.

limiter := rate.NewLimiter(rate.Every(200*time.Millisecond), 1)

Allow

Allow сообщает, доступен ли токен прямо сейчас. Метод возвращает true и расходует токен либо немедленно возвращает false. Используйте его, чтобы отклонять лишние запросы.

if !limiter.Allow() {
    fmt.Println("rejected: too many requests")
    return
}

Wait

Wait блокируется до появления доступного токена или отмены контекста. Этот метод подходит, когда нужно регулировать темп работы, а не отбрасывать её.

if err := limiter.Wait(ctx); err != nil {
    return err
}
doWork()

Reserve

Reserve возвращает объект Reservation, описывающий время ожидания. Вызовите Delay(), чтобы узнать это время, и Cancel(), если решите не продолжать.

r := limiter.Reserve()
if !r.OK() {
    return
}
time.Sleep(r.Delay())

Примечание: внешний пакет

Пакет rate не входит в стандартную библиотеку, поэтому для него нужны go get golang.org/x/time/rate и модуль. Фрагменты, импортирующие этот пакет, предназначены для иллюстрации и здесь встроенно не запускаются.

Запускаемый аналог на основе стандартной библиотеки

Поскольку пакет rate является внешним, ниже приведён цикл регулирования на основе стандартной библиотеки, имитирующий Wait с помощью тикера, срабатывающего каждые 200 мс.

package main

import (
    "fmt"
    "time"
)

func main() {
    tick := time.NewTicker(200 * time.Millisecond)
    defer tick.Stop()
    for i := 0; i < 4; i++ {
        <-tick.C
        fmt.Println("processed event", i)
    }
}

Настройка во время выполнения

Вы можете изменять ограничения на лету с помощью SetLimit и SetBurst. Это удобно, когда перезагрузка конфигурации или ответ 429 от вышестоящего сервиса сообщает, что нужно замедлиться.

limiter.SetLimit(rate.Limit(20))
limiter.SetBurst(10)

Ограничители для отдельных клиентов

Храните карту, сопоставляющую ключ клиента с *rate.Limiter, под защитой мьютекса. При первом запросе с этим ключом создавайте ограничитель, а в последующих запросах переиспользуйте его.

func getLimiter(m map[string]*rate.Limiter, key string) *rate.Limiter {
    if l, ok := m[key]; ok {
        return l
    }
    l := rate.NewLimiter(rate.Limit(5), 10)
    m[key] = l
    return l
}

Промежуточное ПО HTTP

Оберните обработчики так, чтобы каждый запрос сначала вызывал Allow(). Если результатом будет false, верните ответ HTTP 429 «Слишком много запросов». Это канонический способ ограничивать частоту запросов на стороне сервера.

Проверка знаний

Проверьте свои знания о пакете ограничения частоты запросов.

Итоги

Вы изучили golang.org/x/time/rate:

  • NewLimiter(rate, burst) создаёт токеновое ведро
  • rate.Every преобразует интервал в скорость
  • Allow отклоняет запросы, Wait дозирует их, Reserve сообщает о задержке
  • SetLimit и SetBurst позволяют настраивать параметры во время работы
  • Карта клиентов и HTTP 429 для серверов

Часто задаваемые вопросы

Урок «golang.org/x/time/rate» бесплатный?

Да — полный текст урока «golang.org/x/time/rate» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «golang.org/x/time/rate»?

Используйте ограничитель частоты Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «golang.org/x/time/rate»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Концепция корзины токенов
  2. golang.org/x/time/rate
  3. Ограничение горутин
  4. Отложенный повтор
← Назад к Go Academy