Этот вопрос оценивает понимание принципов работы распределённых систем и умение проектировать системы, устойчивые к сбоям.
Отказоустойчивость начинается с принятия факта, что сбои неизбежны. Система должна корректно работать при падении отдельных компонентов. Для этого используют репликацию, таймауты и ретраи. Важно избегать единой точки отказа. Также необходимо постоянно наблюдать за системой и быстро реагировать на проблемы.
Проектирование отказоустойчивых систем требует системного мышления и понимания реальных сценариев сбоев.
Отказоустойчивость — это способность системы продолжать работу при частичных сбоях компонентов.
Первый шаг — считать, что:
сервисы могут падать;
сеть может быть нестабильной;
ответы могут приходить с задержкой.
Важно избегать компонентов, от которых зависит вся система:
несколько инстансов сервиса;
репликация баз данных;
резервные узлы.
Каждый сетевой вызов должен иметь таймаут:
requests.get(url, timeout=2)
Ретраи должны быть:
ограниченными;
с задержкой;
без бесконечных повторов.
Если часть системы недоступна:
возвращать частичный результат;
отключать необязательный функционал.
Для быстрого реагирования нужны:
логи;
метрики;
алерты.
Отказоустойчивая система не пытается избежать сбоев, а готова к ним. Чем раньше это закладывается в дизайн, тем стабильнее система в продакшене.