Как избежать ошибки 500 при Timeout от БД

«Как избежать ошибки 500 при Timeout от БД» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Используйте контексты для управления таймаутами запросов к БД. Устанавливайте разумные дедлайны и обрабатывайте ошибки контекста. Пример:

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()

row := db.QueryRowContext(ctx, "SELECT * FROM users WHERE id = $1", userID)
if err := row.Scan(&user); err != nil {
    if errors.Is(err, context.DeadlineExceeded) {
        // Обработка таймаута
        return fmt.Errorf("database timeout")
    }
    // Другие ошибки
    return err
}

Дополнительные меры:

  • Настройте пул соединений (SetMaxOpenConns, SetConnMaxLifetime)
  • Реализуйте retry-логику для временных ошибок
  • Добавьте circuit breakers
  • Мониторьте длительные запросы