Sobes.tech
Junior — Middle

Ispričajte o situaciji u kojoj ste uspjeli povećati efikasnost rada REST API-ja.

sobes.tech АИ

Одговор од АИ

U jednom od mojih projekata u Go jeziku, poboljšao sam efikasnost REST API-ja optimizacijom obrade zahteva i skraćenjem vremena odgovora.

Šta je urađeno:

  1. Keširanje: dodao sam keširanje često traženih podataka pomoću in-memory keša (npr. Redis ili ugrađena mapa sa mutexom), kako bih smanjio opterećenje na bazu podataka.

  2. Paralelna obrada: koristio sam goroutine za paralelno izvršavanje nezavisnih operacija tokom obrade zahteva.

  3. Optimizacija upita ka bazi: prepisao sam SQL upite, dodao indekse da skratim vreme izvršenja.

  4. Korišćenje context (context.Context): za pravovremeno prekidanje dugih zahteva i oslobađanje resursa.

Primer koda sa keširanjem i goroutine-ima:

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()

    // Simulacija zahteva ka bazi
    data := "podatak iz baze za " + 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")

    // Paralelno dobijanje podataka
    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, "Greška", http.StatusInternalServerError)
        return
    }

    w.Write([]byte(result))
}

Kao rezultat, vreme odgovora API-ja se smanjilo, a opterećenje na bazu je opalo, što je poboljšalo ukupnu performansu servisa.