Дар бораи ҳолате нақл кунед, ки шумо муваффақ шудед самаранокии кори REST API-ро баланд бардоред.
sobes.tech AI
Ҷавоб аз AI
Дар яке аз лоиҳаҳои ман дар Go, ман самаранокии API-ро беҳтар кардам, бо оптимизатсияи коркарди дархостҳо ва кӯтоҳ кардани вақти ҷавоб.
Чӣ кор шуд:
-
Кэшгузорӣ: кэш барои маълумоти зуд-зуд дархостшаванда бо истифода аз кэш дар хотира (масалан, Redis ё харитаи дохилӣ бо mutex) илова кардам, то борро ба базаи додаҳо кам кунам.
-
Коркарди параллел: барои иҷрои параллелии амалиётҳои мустақил дар вақти коркарди дархост, goroutine-ҳоро истифода кардам.
-
Оптимизатсияи саволҳои ба база: SQL саволҳоро навиштам, индекстер илова кардам, то вақти иҷрои онҳоро кам кунам.
-
Истифодаи контекст (context.Context): барои қатъ кардани дархостҳои дарозмуддат ва озод кардани захираҳо.
Намунаи код бо кэшгузорӣ ва goroutine:
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()
// Имоматсия аз база
data := "маълумот аз БД барои " + 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")
// гирифтани маълумот дар параллел
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, "Хатогӣ", http.StatusInternalServerError)
return
}
w.Write([]byte(result))
}
Натиҷа, вақти ҷавобгӯии API кам шуд ва бор дар базаи додаҳо коҳиш ёфт, ки иҷрои умумии хизматрасониро беҳтар кард.