Сриване на Redis при Rate Limiter
Нашият ограничител на заявки съхраняваше състояние в Redis. Redis спря. Ограничаването на заявки спря. DDoS атаката премина.
Хронология:
- 14:00 - Redis master спря за поддръжка
- 14:01 - Ограничителят на заявки не можеше да чете/пише състояние
- 14:01 - Отваряне при грешка: всички заявки разрешени
- 14:02 - 500K заявки/секунда удариха API-то
- 14:03 - API сървърите бяха претоварени
- 14:05 - Пълно прекъсване
Дефектът в дизайна:
Когато хранилището на ограничителя на заявки се провали, избрахме "отваряне при грешка" (разреши всичко) вместо "затваряне при грешка" (блокирай всичко).
Защо направихме този избор:
"Не искаме проблеми с Redis да блокират легитимните потребители."
Какво трябваше да направим:
- Резервен ограничител на заявки в паметта
- Консервативни лимити, когато хранилището е недостъпно
- Redis Sentinel за автоматично превключване
- Ограничаване на заявки на множество нива (CDN, API Gateway, App)
Урок: Контролите за сигурност трябва да се затварят при грешка, не да се отварят. При съмнение - отказвай.