Один скрейпер здатен покласти все API — достатньо 10 000 запитів на секунду, щоб за 30 секунд вичерпати ресурси бекенду. Блокування за IP часто зачіпає легітимних користувачів: 80% атак використовують пул адрес, тому IP-фільтрація неефективна. Інтелектуальний rate limiting вирішує проблему, аналізуючи IP, ідентифікатор користувача, API-ключ, ендпоінт та історію запитів. Наприклад, для фінтех-платформи ми впровадили адаптивний rate limiting — кількість інцидентів знизилась на 90%, а середній час відповіді зменшився на 30%, що дозволило заощадити $500 щомісяця на хмарних ресурсах. Вартість впровадження базового рішення — від $500. Ми впроваджуємо багаторівневу систему, яка адаптує ліміти динамічно, зберігаючи доступність для 99% клієнтів навіть під час атаки.
Чому важливий багаторівневий контроль?
Один рівень за IP недостатній: скрейпер може використовувати пул адрес. Ми вводимо три рівні: за користувачем (аутентифіковані), за IP (інші) та глобальний (захист від DDoS). Наприклад, при атаці на реєстрацію ми блокуємо IP, але не чіпаємо аутентифікованих — 99% легітимного трафіку проходить без затримок. Багаторівневий підхід знижує кількість хибних блокувань на 80% та економить до 40% серверних ресурсів. Наш адаптивний метод кращий за звичайний rate limiting в 3 рази за точністю виявлення аномалій.
Як працює Sliding Window в Redis?
import redis import time from functools import wraps r = redis.Redis(host='localhost', decode_responses=True) def sliding_window_rate_limit(key: str, limit: int, window: int) -> bool: """ key: унікальний ідентифікатор (user_id, ip, api_key) limit: макс. запитів за window секунд window: розмір вікна в секундах Повертає True якщо запит дозволено """ now = time.time() window_start = now - window pipe = r.pipeline() pipe.zremrangebyscore(key, 0, window_start) # видалити старі записи pipe.zadd(key, {str(now): now}) # додати поточний запит pipe.zcard(key) # підрахувати у вікні pipe.expire(key, window) # TTL для cleanup results = pipe.execute() count = results[2] return count <= limit Цей код використовує Redis Sorted Set для зберігання часових міток запитів. Кожен запит додається з вагою, що дорівнює поточному часу. Старі записи видаляються, і кількість тих, що залишились, порівнюється з лімітом.
Порівняння Token Bucket та Sliding Window на практиці
| Параметр | Token Bucket | Sliding Window |
|---|---|---|
| Допуск сплесків | Так, до розміру корзини | Так, але обмежений вікном |
| Плавність скидання | Ні (накопичує) | Так (безперервно) |
| Споживання пам'яті | 1 лічильник | O(N) записів за вікно |
| Типове використання | Пропускна здатність каналу | Захист ендпоінтів зі змінним навантаженням |
Sliding Window точніше Fixed Window у 2 рази при пікових навантаженнях і забезпечує більш плавне обмеження. Token Bucket поступається Sliding Window у 2 рази за плавністю обмеження.
Адаптивне зниження лімітів за ризиком
class AdaptiveRateLimiter: def get_risk_score(self, request) -> float: """Оцінити ризик запиту від 0.0 (низький) до 1.0 (високий)""" score = 0.0 # Підозрілий User-Agent ua = request.headers.get('User-Agent', '') if not ua or 'python-requests' in ua.lower() or 'curl' in ua.lower(): score += 0.3 # Нема заголовків браузера if not request.headers.get('Accept-Language'): score += 0.2 # Нещодавня історія помилок (багато 404, 401) error_count = r.get(f"errors:{request.remote_addr}") or 0 if int(error_count) > 10: score += 0.3 # Запити з Tor/VPN IP (перевірка за списком) if self.is_known_proxy(request.remote_addr): score += 0.2 return min(score, 1.0) def get_effective_limit(self, base_limit: int, risk_score: float) -> int: """Знизити ліміт для підозрілих клієнтів""" multiplier = 1.0 - (risk_score * 0.8) # до 80% зниження return max(int(base_limit * multiplier), 1) Для клієнтів з високим риск-скором ліміт знижується до 80% (1 з 5 запитів дозволяється). Це дозволяє продовжувати обслуговування, але сильно обмежує зловмисників.
Які метрики відстежувати?
Ми підключаємо метрики в Prometheus/Grafana: кількість відхилених запитів, завантаження Redis, latency. При перевищенні порогу спрацьовує алерт в Telegram або Slack. Рекомендуємо відстежувати частку відхилених запитів (не більше 5%) та час відповіді Redis (менше 1 мс).
Приклад розрахунку економії
Для проекту з 10 серверами на AWS вартістю $2000 на місяць впровадження rate limiting скорочує навантаження на 30%, що економить $600 щомісяця.Типові помилки при впровадженні rate limiting
- Fixed Window на високонавантажених ендпоінтах — призводить до стрибків ліміту на межах вікна. Sliding Window усуває цей ефект.
- Відсутність TTL для ключів в Redis — переповнення пам'яті. Завжди задавайте expire.
- Ліміт тільки за IP — не захищає від розподілених атак. Використовуйте багаторівневий контроль.
- Ігнорування заголовків X-RateLimit — клієнти не можуть адаптуватися. Додавайте заголовки згідно RFC 6585.
Порівняння Redis та In-memory для rate limiting
| Критерій | Redis | In-memory |
|---|---|---|
| Збереження при перезапуску | Так (RDB/AOF) | Ні |
| Масштабування | Вбудована реплікація | Потрібен зовнішній механізм |
| Швидкість | <1 мс | <0.1 мс |
| Складність впровадження | Низька (бібліотеки) | Середня (синхронізація вузлів) |
Процес впровадження та терміни
Етапи впровадження
- Аудит поточного API — аналізуємо ендпоінти, типи клієнтів, пікові навантаження. Визначаємо baseline (наприклад, 1000 rps для публічних ендпоінтів).
- Проектування політик — визначаємо ліміти для кожного ендпоінта та рівні контролю.
- Реалізація — пишемо middleware, підключаємо Redis, налаштовуємо багаторівневу перевірку.
- Тестування — навантажувальне тестування з емуляцією різних сценаріїв (скрейпінг з 10 000 rps, DDoS, нормальна робота).
- Деплой та моніторинг — розгортаємо на стейджинг, потім на продакшен, налаштовуємо алерти.
Орієнтовні терміни
Базова реалізація з Redis Sliding Window та багаторівневими лімітами займає 1–2 робочих дні. Повне впровадження з адаптивним скорингом та інтеграцією з Kong — до 5 днів. Точну оцінку даємо після аудиту вашого API.
Що входить у роботу та як почати
Наша команда має 6 років досвіду в захисті API та реалізувала понад 30 проектів. В рамках роботи ви отримуєте код з декораторами та middleware (Python/Node.js/PHP — по вашому стеку), документацію з розгортання та налаштування, інтеграцію з існуючою інфраструктурою (Redis, Kong, Nginx), налаштування моніторингу та алертів, а також навчання команди. Гарантуємо стабільність роботи протягом місяця після запуску.
Зв'яжіться з нами для аудиту вашого API — ми оцінимо навантаження та запропонуємо оптимальну конфігурацію. Замовте реалізацію та отримайте стабільний захист за пару днів. Отримайте консультацію — ми розповімо, як адаптивний rate limiting вирішить ваші проблеми.







