Rate Limiting защищает от конкретных плохих клиентов. Но что если пришел легитимный трафик, просто его слишком много? Если сервер попытается обработать всё, он исчерпает RAM/CPU и умрет.
Load Shedding (Сброс нагрузки) — это механизм самосохранения. Мы жертвуем частью некритичного трафика, чтобы спасти более важные части/функциональность системы.
1. Fleet Usage (Сброс с резервированием)
Трафик жестко делится на критичный (например, оплата заказа) и некритичный (обновление аватарки). Мы резервируем часть пропускной способности (например, 10%) только для критичных запросов.
Python
class RequestType:
CRITICAL = 'critical'
NON_CRITICAL = 'non_critical'
TOTAL_CAPACITY = 1000 # Общая пропускная способность
RESERVED_PERCENT = 0.10 # 10% резерв для критичных
reserved = int(TOTAL_CAPACITY * RESERVED_PERCENT)
2. Worker Utilization (Сброс по утилизации)
Система постоянно отслеживает загрузку своих воркеров (потоков). При достижении определенных порогов загрузки, она начинает избирательно отсекать запросы, начиная с самых низкоприоритетных.
| Утилизация | Действие | Результат |
| До 70% | Нет сброса | Все HTTP-запросы обрабатываются |
| >= 80% | Warning | Включаются алерты дежурным инженерам |
| >= 90% | Сброс тестов и GET | Возвращаем 503 для тестового трафика и тяжелых выборок |
| >= 95% | Сброс POST | Возвращаем 503 для некритичных изменений данных |
| 100% | Авария | Отказ в обслуживании для всех |
Python
class Priority:
CRITICAL = 1 # Высший
POST = 2
GET = 3
TEST = 4 # Низший
MAX_WORKERS = 100