Концепция корзины токенов
Ограничивайте частоту запросов
«Концепция корзины токенов» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Зачем ограничивать частоту
Ограничение частоты ограничивает количество операций за единицу времени. Оно защищает API от злоупотреблений, помогает соблюдать квоты сторонних сервисов и сохраняет стабильность систем под нагрузкой.
- Предотвращает перегрузку
- Обеспечивает справедливое использование
- Соблюдает ограничения вышестоящих сервисов
Модель корзины токенов
Представьте корзину, в которой хранятся токены. Для выполнения каждый запрос должен получить токен. Токены пополняются с постоянной скоростью. Если корзина пуста, запрос ждёт или отклоняется.
Скорость и всплеск
Корзину токенов определяют два параметра: скорость (число добавляемых в секунду токенов) и всплеск (вместимость корзины). Всплеск позволяет кратковременно превышать постоянную скорость.
Пополнение со временем
Если скорость составляет 5 токенов в секунду, примерно каждые 200 миллисекунд появляется один токен. В корзине никогда не бывает больше токенов, чем позволяет её вместимость для всплеска, поэтому свободное место не накапливается бесконечно.
Разрешение всплесков
Всплеск размером 10 означает, что при полной корзине можно немедленно отправить до 10 запросов. После этого запросы будут выполняться с постоянной скоростью. Так обеспечивается баланс между отзывчивостью и контролем.
Простая проверка по времени
Ограничение частоты можно приблизительно реализовать с помощью тикера, который выдаёт разрешение через фиксированные интервалы. Каждый запрос ждёт следующего сигнала тикера.
ticker := time.NewTicker(200 * time.Millisecond)
defer ticker.Stop()
for i := 0; i < 3; i++ {
<-ticker.C
fmt.Println("request", i)
}Корзина токенов и дырявая корзина
Дырявая корзина опустошается с постоянной скоростью и полностью сглаживает выходной поток, запрещая всплески. Корзина токенов допускает всплески в пределах своей вместимости. Для ограничений API чаще используют корзину токенов.
Минимальная симуляция корзины
Этот запускаемый пример моделирует корзину токенов вместимостью 3, пополняемую каждые 100 мс, и показывает, какие запросы разрешены.
package main
import (
"fmt"
"time"
)
func main() {
tokens := 3
last := time.Now()
rate := 100 * time.Millisecond
for i := 0; i < 6; i++ {
elapsed := time.Since(last)
refill := int(elapsed / rate)
if refill > 0 {
tokens += refill
if tokens > 3 {
tokens = 3
}
last = time.Now()
}
if tokens > 0 {
tokens--
fmt.Println("request", i, "allowed")
} else {
fmt.Println("request", i, "rejected")
}
time.Sleep(40 * time.Millisecond)
}
}Allow, Wait или Reserve
Ограничители обычно предлагают три варианта поведения: Allow немедленно возвращает true или false, Wait блокируется до появления свободного токена, а Reserve сообщает, сколько нужно ждать. Выбирайте вариант в зависимости от того, можете ли Вы блокироваться.
Где применяются ограничения
Ограничения частоты могут действовать для клиента, конечной точки или всей системы. Карта ограничителей, ключами которой служат IP клиентов, устанавливает квоты для отдельных клиентов, а один общий ограничитель ограничивает общую пропускную способность.
Выбор параметров
Согласуйте скорость с квотой вышестоящего сервиса. Если API разрешает 600 запросов в минуту, установите скорость 10 запросов в секунду. Установите размер всплеска так, чтобы поглощать ожидаемые скачки, не превышая среднюю скорость.
Быстрая проверка
Проверьте, насколько хорошо Вы понимаете корзину токенов.
Итоги
Вы изучили концепцию корзины токенов:
- Токены расходуются на каждый запрос и пополняются с заданной скоростью
- Всплеск задаёт вместимость корзины для кратковременных скачков
- Корзина токенов допускает всплески, а дырявая корзина — нет
- Allow, Wait и Reserve — распространённые интерфейсы
Часто задаваемые вопросы
Урок «Концепция корзины токенов» бесплатный?
Да — полный текст урока «Концепция корзины токенов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Концепция корзины токенов»?
Ограничивайте частоту запросов Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Концепция корзины токенов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Концепция корзины токенов
- golang.org/x/time/rate
- Ограничение горутин
- Отложенный повтор