Sobes.tech
Junior — Middle

Papaskinkite apie situaciją, kai pavyko pagerinti REST API darbo efektyvumą.

sobes.tech AI

Atsakymas iš AI

Viename iš mano projektų Go kalba, pagerinau REST API efektyvumą, optimizuodamas užklausų apdorojimą ir sutrumpindamas atsako laiką.

Kas buvo padaryta:

  1. Kaušas: pridėjau dažnai užklausiamų duomenų kaupimą naudojant atmintyje esančią kaupimo sistemą (pvz., Redis arba vidinę žemėlapį su mutex), siekiant sumažinti apkrovą duomenų bazėje.

  2. Lygiagretus apdorojimas: naudoju goroutines, kad vykdyčiau nepriklausomas operacijas lygiagrečiai užklausos apdorojimo metu.

  3. Duomenų bazės užklausų optimizavimas: perrašiau SQL užklausas, pridėjiau indeksus, kad sumažinčiau jų vykdymo laiką.

  4. Naudojant kontekstą (context.Context): siekiant laiku nutraukti ilgus užklausimus ir atlaisvinti išteklius.

Kodo pavyzdys su kaušais ir goroutines:

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

    // Duomenų bazės užklausos simuliacija
    data := "duomenys iš DB " + 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")

    // Lygiagretus duomenų gavimas
    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, "Klaida", http.StatusInternalServerError)
        return
    }

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

Rezultatas — API atsako laikas sumažėjo, o apkrova duomenų bazėje — sumažėjo, kas pagerino bendrą paslaugos našumą.