> Как определить причину медленной работы REST API при ответе через 20 секунд (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Лига Цифровой Экономики

Стек: Go

> Пример ответа

Для диагностики 20-секундной задержки в REST API на Go нужно системно проверить несколько уровней.

  1. Измерение времени на стороне клиента - сначала убедитесь, что задержка именно на сервере, а не в сети. Используйте curl -w "%{time_total}" или инструменты вроде httpstat.

  2. Логирование времени обработки - добавьте middleware, замеряющий время каждого запроса:

GO
func timingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
log.Printf("%s %s took %v", r.Method, r.URL.Path, time.Since(start))
})
}
  1. Профилирование pprof - включите стандартный профилировщик Go:
GO
import _ "net/http/pprof"
// затем: go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30

Это покажет, где тратится CPU время: блокировки, аллокации, вызовы.

  1. Проверка блокировок - используйте go tool trace для поиска горутин, ожидающих каналы, мьютексы или I/O. Частая причина - deadlock или contention на общих ресурсах.

  2. Блокирующие вызовы БД - проверьте, не выполняются ли медленные SQL-запросы. Добавьте таймауты для контекста:

GO
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
defer cancel()
// передайте ctx в db.QueryContext
  1. Сетевые задержки - если API вызывает внешние сервисы, убедитесь, что у HTTP-клиента установлены таймауты:
GO
client := &http.Client{Timeout: 10 * time.Second}
  1. Ограничения ресурсов - проверьте, не упирается ли приложение в лимиты CPU/памяти контейнера или ОС. Используйте top, htop, или метрики облачного провайдера.

  2. GC паузы - если приложение активно выделяет память, сборщик мусора может вызывать задержки. Включите логирование GC: GODEBUG=gctrace=1.

Типичная причина - отсутствие таймаутов на входящие запросы или на вызовы БД, что приводит к зависанию горутин. Начните с добавления таймаутов и профилирования pprof.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью