Sobes.tech
Junior — Middle

Дар бораи ҳолате нақл кунед, ки шумо муваффақ шудед самаранокии кори REST API-ро баланд бардоред.

sobes.tech AI

Ҷавоб аз AI

Дар яке аз лоиҳаҳои ман дар Go, ман самаранокии API-ро беҳтар кардам, бо оптимизатсияи коркарди дархостҳо ва кӯтоҳ кардани вақти ҷавоб.

Чӣ кор шуд:

  1. Кэшгузорӣ: кэш барои маълумоти зуд-зуд дархостшаванда бо истифода аз кэш дар хотира (масалан, Redis ё харитаи дохилӣ бо mutex) илова кардам, то борро ба базаи додаҳо кам кунам.

  2. Коркарди параллел: барои иҷрои параллелии амалиётҳои мустақил дар вақти коркарди дархост, goroutine-ҳоро истифода кардам.

  3. Оптимизатсияи саволҳои ба база: SQL саволҳоро навиштам, индекстер илова кардам, то вақти иҷрои онҳоро кам кунам.

  4. Истифодаи контекст (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 кам шуд ва бор дар базаи додаҳо коҳиш ёфт, ки иҷрои умумии хизматрасониро беҳтар кард.