Как обеспечить отказоустойчивость
Что проверяют
Умеете ли вы превратить общее слово «отказоустойчивость» в конкретные механизмы на уровне кода и инфраструктуры. Следом обычно спрашивают, что будет с сервисом, если зависимость начнёт отвечать за 30 секунд вместо 50 миллисекунд.
Как отвечать
Идите от принципа: любой сетевой вызов может упасть или зависнуть, и сервис должен это пережить, не утащив за собой соседей.
- таймауты везде: у
http.Clientпо умолчанию таймаута нет, его задают явно, а каждый исходящий вызов получаетcontext.WithTimeoutс дедлайном короче входящего запроса. Уhttp.ServerвыставляютReadHeaderTimeoutи остальные таймауты; - повторы с умом: только для идемпотентных операций, с экспоненциальной задержкой, джиттером и лимитом попыток. Для POST нужен ключ идемпотентности;
- circuit breaker: после серии ошибок перестаём ходить в больную зависимость и сразу отдаём фолбэк, например через
sony/gobreaker; - ограничение конкурентности: семафор или
errgroupсSetLimit, лимит запросов черезgolang.org/x/time/rate, чтобы одна медленная зависимость не съела все горутины и память; - паники:
recoverработает только в своей горутине, поэтому паника в фоновой горутине роняет весь процесс. Защита нужна вокруг каждогоgo func(), а не только в HTTP-middleware; - graceful shutdown:
signal.NotifyContextна SIGTERM иserver.Shutdown(ctx), чтобы при раскатке не рвались запросы.
Уровень инфраструктуры: несколько реплик в разных зонах, readiness и liveness пробы, реплики базы с автоматическим переключением, очередь с доставкой «хотя бы один раз» и идемпотентными обработчиками. Отдать кеш или урезанный ответ лучше, чем 500. Всё это держится на метриках Prometheus и алертах по ошибкам и задержкам.
Где спотыкаются
Добавляют ретраи без задержки и бюджета. При сбое каждый клиент умножает нагрузку в разы и добивает зависимость, которая могла бы подняться.
Проверяют базу в liveness-пробе. База моргнула, Kubernetes перезапускает все поды разом, и мелкий сбой превращается в полный простой.
Говорят только про Kubernetes и реплики. Интервьюер ждёт и кодовый уровень: таймауты, контекст, отмену, обработку паник.