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:
-
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.
-
Lygiagretus apdorojimas: naudoju goroutines, kad vykdyčiau nepriklausomas operacijas lygiagrečiai užklausos apdorojimo metu.
-
Duomenų bazės užklausų optimizavimas: perrašiau SQL užklausas, pridėjiau indeksus, kad sumažinčiau jų vykdymo laiką.
-
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ą.