Нашият ограничител на заявки съхраняваше състояние в 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)

Урок: Контролите за сигурност трябва да се затварят при грешка, не да се отварят. При съмнение - отказвай.


← Назад към Научени Уроци