Какие бывают типы rate limiting (token bucket, leaky bucket) и где они применяются
1️⃣ Как кратко ответить
Rate limiting — это техника управления потоком данных, чтобы предотвратить перегрузку системы. Основные типы: token bucket и leaky bucket. Token bucket позволяет гибко накапливать и использовать токены для обработки запросов, обеспечивая гибкость в пиковых нагрузках. Leaky bucket выравнивает поток запросов, обеспечивая постоянную скорость обработки, что полезно для стабилизации нагрузки.
2️⃣ Подробное объяснение темы
Rate limiting — это метод контроля количества запросов, которые могут быть обработаны системой за определенный период времени. Это важно для предотвращения перегрузки серверов, обеспечения справедливого распределения ресурсов и защиты от злоупотреблений, таких как DDoS-атаки. Существует несколько алгоритмов для реализации rate limiting, среди которых наиболее популярны token bucket и leaky bucket.
Token Bucket
Token bucket — это алгоритм, который позволяет накапливать "токены" в "ведре" с определенной скоростью. Каждый токен представляет собой разрешение на выполнение одного запроса. Когда приходит запрос, система проверяет, есть ли в ведре токены. Если есть, один токен удаляется, и запрос обрабатывается. Если токенов нет, запрос отклоняется или задерживается.
Пример работы:
- Инициализация: Ведро имеет максимальную емкость
Cтокенов и наполняется токенами со скоростьюRтокенов в секунду. - Прием запроса: Когда приходит запрос, проверяется наличие токенов.
- Обработка: Если токены есть, один токен удаляется, и запрос обрабатывается.
- Отклонение: Если токенов нет, запрос отклоняется или ставится в очередь.
type TokenBucket struct {
capacity int // Максимальная емкость ведра
tokens int // Текущее количество токенов
refillRate int // Скорость пополнения токенов в секунду
lastRefill time.Time // Время последнего пополнения
}
func (tb *TokenBucket) Allow() bool {
now := time.Now()
elapsed := now.Sub(tb.lastRefill).Seconds()
tb.tokens += int(elapsed) * tb.refillRate // Пополнение токенов
if tb.tokens > tb.capacity {
tb.tokens = tb.capacity // Ограничение по емкости
}
tb.lastRefill = now
if tb.tokens > 0 {
tb.tokens-- // Удаление токена для обработки запроса
return true
}
return false // Отклонение запроса
}
Leaky Bucket
Leaky bucket — это алгоритм, который выравнивает поток запросов, обеспечивая постоянную скорость обработки. Он работает как ведро с дыркой: запросы поступают в ведро, и они "утекают" с постоянной скоростью. Если ведро переполняется, новые запросы отклоняются.
Пример работы:
- Инициализация: Ведро имеет фиксированную емкость
C. - Прием запроса: Запросы поступают в ведро.
- Обработка: Запросы "утекают" из ведра с постоянной скоростью
R. - Отклонение: Если ведро переполнено, новые запросы отклоняются.
type LeakyBucket struct {
capacity int // Максимальная емкость ведра
currentLoad int // Текущая загрузка ведра
leakRate int // Скорость утечки запросов в секунду
lastLeakTime time.Time // Время последней утечки
}
func (lb *LeakyBucket) Allow() bool {
now := time.Now()
elapsed := now.Sub(lb.lastLeakTime).Seconds()
lb.currentLoad -= int(elapsed) * lb.leakRate // Утечка запросов
if lb.currentLoad < 0 {
lb.currentLoad = 0 // Ограничение по минимальной загрузке
}
lb.lastLeakTime = now
if lb.currentLoad < lb.capacity {
lb.currentLoad++ // Добавление запроса в ведро
return true
}
return false // Отклонение запроса
}
Применение
- Token Bucket: Используется в системах, где важна гибкость в обработке пиковых нагрузок, например, в API-сервисах, где могут быть резкие всплески запросов.
- Leaky Bucket: Применяется в системах, где важна стабильность и постоянная скорость обработки, например, в сетевых маршрутизаторах для управления трафиком.
Оба алгоритма помогают эффективно управлять ресурсами и обеспечивать стабильную работу систем под нагрузкой.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться