Sobes.tech
Junior — Middle

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:

  1. 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.

  2. Przetwarzanie równoległe: użyłem goroutine’ów do równoległego wykonywania niezależnych operacji podczas obsługi zapytania.

  3. Optymalizacja zapytań do bazy: przepisałem zapytania SQL, dodałem indeksy, aby skrócić czas ich wykonania.

  4. 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.