Opowiedz o sytuacji, w której udało Ci się zwiększyć wydajność pracy API REST.
sobes.tech AI
Odpowiedź od AI
W jednym z moich projektów w Go poprawiłem wydajność API REST, optymalizując obsługę zapytań i skracając czas odpowiedzi.
Co zostało zrobione:
-
Cache’owanie: dodałem cache dla często żądanych danych, korzystając z pamięci (np. Redis lub wbudowana mapa z mutexem), aby zmniejszyć obciążenie bazy danych.
-
Przetwarzanie równoległe: użyłem goroutine’ów do równoległego wykonywania niezależnych operacji podczas obsługi zapytania.
-
Optymalizacja zapytań do bazy: przepisałem zapytania SQL, dodałem indeksy, aby skrócić czas ich wykonania.
-
Użycie context (context.Context): do terminowego przerywania długich zapytań i zwalniania zasobów.
Przykład kodu z cache’owaniem i goroutine’ami:
var cache = make(map[string]string)
var mu sync.RWMutex
func getData(key string) (string, error) {
mu.RLock()
if val, ok := cache[key]; ok {
mu.RUnlock()
return val, nil
}
mu.RUnlock()
// Symulacja zapytania do bazy
data := "dane z bazy dla " + key
mu.Lock()
cache[key] = data
mu.Unlock()
return data, nil
}
func handler(w http.ResponseWriter, r *http.Request) {
key := r.URL.Query().Get("key")
// Równoległe pobieranie danych
var wg sync.WaitGroup
var result string
var err error
wg.Add(1)
go func() {
defer wg.Done()
result, err = getData(key)
}()
wg.Wait()
if err != nil {
http.Error(w, "Błąd", http.StatusInternalServerError)
return
}
w.Write([]byte(result))
}
W efekcie czas odpowiedzi API się skrócił, obciążenie bazy danych zmalało, co poprawiło ogólną wydajność usługi.