💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат и результаты по 6 тематическим шкалам с объяснениями и практическими рекомендациями.
Вопрос 7 из 30
На ревью разбирают тему «Метрики». Что нужно поменять, чтобы граничный случай не превратился в сбой?
Текст Метрики: фрагмент на ревью Копировать
requests_total{method="GET",route="/users/:id",status="200"} 42
request_duration_seconds_bucket{route="/users/:id",le="0.5"} 40
Контекст проверки: Метрики.
Считать запросы, категории ошибок, гистограмму задержки, очередь и ресурсы зависимостей; связывать с трассировкой через exemplar.
Перестать принимать трафик, снять готовность, дать запросам срок завершиться и затем принудительно закрыть остаток.
Настраивать лимиты по профилю зависимости, иметь глобальный бюджет и корректно останавливать при выпуске.
Ограничивать кардинальность меток, контролировать очередь лимитера и не удерживать глобальную блокировку во время `next`.
Сочетать лимит параллелизма, отмену, предохранитель от серии ошибок и метрики насыщения пула.
Вопрос 12 из 30
В разделе «Корректное завершение» показан конкретный случай. Какую правку стоит предложить на ревью, сохранив назначение кода?
Go Корректное завершение: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
import("context";"net/http";"time")
func shutdown(s *http.Server){ctx,cancel:=context.WithTimeout(context.Background(),10*time.Second);defer cancel();_=s.Shutdown(ctx)}
func main(){}
Ограничивать кардинальность меток, контролировать очередь лимитера и не удерживать глобальную блокировку во время `next`.
Не запускать скрытую вечную горутину без способа остановки, контекста и наблюдаемой ошибки.
Ограничивать параллелизм, задавать контекст, отслеживать WaitCount/WaitDuration и избегать запросов N+1.
Настраивать лимиты по профилю зависимости, иметь глобальный бюджет и корректно останавливать при выпуске.
Иметь общий корневой контекст, идемпотентное закрытие, ограниченный льготный срок и принудительный финальный путь.
Вопрос 18 из 30
Перед публикацией кода по теме «Расследование сбоя» нужно уточнить контракт. Какое правило отделяет верный разбор от правдоподобной догадки?
Текст Расследование сбоя: проверка контракта Копировать
12:01 deploy v1242
12:03 p99 180ms -> 4.8s
12:03 db_in_use 20/20
12:04 db_wait_duration +38s/s
12:05 cpu 31%
Вопрос относится к теме: Расследование сбоя.
Профили мьютексов и блокировок показывают ожидание, которое не видно в обычном CPU-профиле.
Конкурентный дефект может проявляться как редкая порча данных, рост горутин, взаимная блокировка или хвост задержки; нужен набор сигналов.
Число работников, размер буфера и политика повторов образуют единую систему управления нагрузкой.
Расследование строит временную линию из симптома, изменений, метрик, журналов, трассировок и профилей, не начиная с любимой гипотезы.
Параллельные тесты разделяют процесс, глобальные переменные и внешние ресурсы, поэтому изоляция должна быть явной.
Вопрос 23 из 30
В рабочем примере по теме «Тестирование и наблюдаемость» важно отделить гарантию от догадки в тесте «Надёжный Go-сервис в производстве». Какое правило важнее случайных деталей конкретного запуска?
Текст Тестирование и наблюдаемость: проверка контракта Копировать
release:
canary_percent: 5
abort_if:
error_rate: "> 1%"
p99: "> 800ms"
Вопрос относится к теме: Тестирование и наблюдаемость.
Слой данных тестируют на ошибках начала, запроса, сканирования и коммита; отдельно нужен интеграционный тест реальной базы.
Детектор гонок находит только гонки, проявившиеся в выполненных путях, поэтому нужны разнообразная нагрузка и повторение.
После исправления нужны тест инварианта, повтор под `-race` и наблюдение симптома, по которому дефект был найден.
Производительность проверяют устойчивым бенчмарком, базовой линией и эксплуатационными метриками, а не одним быстрым запуском.
Перед выпуском нужны модульные, интеграционные и нагрузочные проверки критических путей, а после — контролируемое наблюдение новых ошибок и задержки.
Вопрос 27 из 30
В рабочем примере по теме «Конкурентность и эксплуатация» важно отделить гарантию от догадки. Что нужно поменять, чтобы граничный случай не превратился в сбой?
Go Конкурентность и эксплуатация: фрагмент на ревью Копировать
// Фрагмент из ревью: требуется выбрать безопасную правку.
package main
const maxConcurrent=64
var slots=make(chan struct{},maxConcurrent)
func guarded(fn func()error)error{select{case slots<-struct{}{}:defer func(){<-slots}();return fn();default:return ErrBusy}}
var ErrBusy=errorString("busy")
type errorString string
func(e errorString)Error()string{return string(e)}
func main(){}
Сочетать лимит параллелизма, отмену, предохранитель от серии ошибок и метрики насыщения пула.
Не запускать скрытую вечную горутину без способа остановки, контекста и наблюдаемой ошибки.
Настраивать лимиты по профилю зависимости, иметь глобальный бюджет и корректно останавливать при выпуске.
Ограничивать кардинальность меток, контролировать очередь лимитера и не удерживать глобальную блокировку во время `next`.
Связать лимиты HTTP, пула базы и внешних клиентов; следить за горутинами, памятью, паузами GC и очередями.