Короткий ответ
Graceful degradation — это стратегия, при которой сервис при перегрузке или частичном отказе зависимостей продолжает отвечать пользователям хотя бы ограниченной функциональностью (например, без рекомендаций, с кэшированными данными), а не падает полностью.
Как это работает подробнее
для этого заранее выделяют критичную функциональность (например, "показать товар и дать купить") и некритичную (например, "показать персональные рекомендации") и проектируют так, чтобы отказ некритичной части не блокировал критичную — через fallback-значения, кэш, feature flags или таймауты с заглушкой.
Пример / кейс
Ожидаемое поведение: при недоступности сервиса рекомендаций пользователь всё равно видит страницу товара и может совершить покупку; только блок рекомендаций пуст — это и есть graceful degradation в действии.
Пример кода
try:
recommendations = recommendation_service.get(user_id, timeout=0.3)
except TimeoutError:
recommendations = [] # сервис деградирует, но страница товара отображаетсяЧто использовать на практике
- Практический подход. Деградацию проектируют заранее, а не изобретают во время инцидента — например, если сервис рекомендаций недоступен, страница товара отображается без блока рекомендаций вместо ошибки 500. Нужно явно решить, какие функции можно "выключить" под нагрузкой и в каком порядке.
Подводные камни
- Частые ошибки. Делать все внешние вызовы одинаково критичными, из-за чего отказ вспомогательного сервиса валит всю страницу; не тестировать сценарии деградации заранее; путать graceful degradation с простым увеличением таймаутов, что не решает проблему, а лишь отодвигает её.