6.6Kпросмотров
15 июля 2023 г.
Score: 7.3K
🔥 Rate Limiting Rate Limiting — это стратегия ограничения сетевого трафика. Устанавливается ограничение на то, как часто кто-то может повторять запросы в течение определенного периода времени. Например, если мы выставляем какое-то внешнее API и хотим ограничить RPS для пользователей, чтобы предотвратить DDoS (Distributed Denial-of-Service). 🛡️ Запросы сверх ограничения (квоты) могут быть отклонены с ошибкой "429 Too Many Requests". ⚙️Алгоритмы, по которым может работать Rate Limiter, допустим, квота 20 запросов в минуту. 1️⃣ Fixed Window Counter - задается фиксированное временное окно, например, 1 минута, и считается кол-во запросов от пользователя за этот период. Если кол-во запросов превышено, отдается 429 ошибка.
🆘 Возможна проблема между 2:00:00 и 2:01:00 было 20 запросов, и между 2:01:00 и 2:02:00 тоже 20 запросов => между 2:00:30 и 2:01:30 может быть 40 запросов. 2️⃣ Sliding Window Log - время запросов хранится в логах. Когда приходит новый запрос, нужно проверить в логах кол-во запросов за последнюю минуту.
🆘 Потребление памяти для логов. 3️⃣ Sliding Window Counter - вычисление взвешенного счетчика для предыдущего временного окна. Например, между 2:00:00 и 2:01:00 было 10 запросов, в текущем окне уже есть 5 запросов, в 2:01:18 приходит еще один запрос: 5 + 10 * (1 - 18/60) = 12 запросов за прошедшую минуту => запрос разрешен.
🆘 Предполагается равномерное распределение запросов => не устойчивость к всплескам. 4️⃣ Token Bucket - используем корзину (bucket) для хранения токенов. Изначально корзина заполнена токенами, в нашем случае, 20 токенов. Каждый запрос потребляет один токен. Когда приходит новый запрос, мы проверяем, достаточно ли токенов в корзине. Если токенов нет, запрос отклоняется. С определенной скоростью пополняем корзину токенами.
🆘 Токены могут накопиться при простое системы, и дальше может случиться всплеск нагрузки. 5️⃣ Leaky Bucket - когда приходит новый запрос, он попадет в очередь (корзину) FIFO (first-in-first-out) и ожидает там. Запросы извлекаются из очереди с фиксированной скоростью (20 запросов в минуту) и обрабатываются. Размер очереди обычно ограничивают.
🆘 Всплеск запросов заполнит очередь старыми запросами и, если они не будут обработаны вовремя, последние запросы будут ограничены по скорости. Нет гарантии, что запросы будут обработаны за фиксированное время. Rate Limiting with NGINX ⬇️ А какой алгоритм используете/использовали вы? ⬇️ #failover
#rate_limiter