Sobes.tech
Junior — Middle

Разкажете за ситуация, в която сте успели да повишите ефективността на работата на REST API.

sobes.tech AI

Отговор от AI

В един от проектите ми на Go подобрих ефективността на REST API, като оптимизирах обработката на заявките и намалих времето за отговор.

Какво беше направено:

  1. Кеширане: добавих кеширане за често изисквани данни с помощта на in-memory кеш (например Redis или вграден map с mutex), за да намаля натоварването върху базата данни.

  2. Паралелна обработка: използвах горутини за паралелно изпълнение на независими операции по време на обработката на заявката.

  3. Оптимизация на заявки към базата: преписах SQL заявките, добавих индекси, за да намаля времето за изпълнение.

  4. Използване на context (context.Context): за своевременно прекъсване на дълги заявки и освобождаване на ресурси.

Примерен код с кеширане и горутини:

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-то се намали, натоварването върху базата данни се понижи, което подобри цялостната производителност на услугата.