Sobes.tech
Junior — Middle

Պատմեք իրավիճակի մասին, երբ հաջողվեցիք բարելավել REST API-ի աշխատանքի արդյունավետությունը։

sobes.tech AI

Պատասխան AI-ից

Իմ Go ծրագրերից մեկում ես բարելավել եմ REST API-ի արդյունավետությունը՝ օպտիմալացնելով հարցումների մշակումը և կրճատելով պատասխանման ժամանակը:

Ի՞նչ է կատարվել՝

  1. Կեշավորում՝ ավելացրել եմ հաճախ պահանջվող տվյալների կեշավորում՝ օգտագործելով հիշողության մեջ գտնվող կեշ (օրինակ՝ Redis կամ ներքին քարտա mutex-ով), որպեսզի նվազեցնեմ տվյալների բազայի բեռը:

  2. Համաժամանակյա մշակում՝ օգտագործել եմ goroutine-ներ՝ անկախ գործողությունները համաժամանակյա իրականացման համար հարցման մշակման ժամանակ:

  3. Տվյալների բազայի հարցումների օպտիմալացում՝ վերաշարադրել եմ SQL հարցումները, ավելացրել եմ ինդեքսներ՝ ժամանակը կրճատելու համար:

  4. Context (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-ի պատասխանման ժամանակը կրճատվեց, բազայի վրա բեռը նվազեց, ինչը բարելավեց ծառայության ընդհանուր կատարողականությունը։