Sobes.tech
Junior — Middle

გააზიარეთ სიტუაცია, როდესაც შეძლეთ REST API-ის მუშაობის ეფექტიანობის გაზრდა.

sobes.tech AI

პასუხი AI-სგან

ჩემი Go პროექტებიდან ერთში, მე გავაუმჯობესე REST 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-ის პასუხის დრო შემცირდა, ბაზაზე დატვირთვა კი — შემცირდა, რაც საერთო შესრულებას გაუმჯობესდა.