Papasakokite daugiau apie projektą Avitoje — ar tai buvo vienintelis projektas per tris metus?
Golang
func (c *Client) Send(ctx context.Context, messages []Message, maxWorkers int) error { sem := make(chan struct{}, maxWorkers) var wg sync.WaitGroup var resultErr error var once sync.Once for _, msg := range messages { wg.Add(1) go func(msg Message) { defer wg.Done() sem <- struct{}{} defer func() { <-sem }() body, err := json.Marshal(msg) if err != nil { once.Do(func() { resultErr = err; cancel() }) return } req, _ := http.NewRequestWithContext( ctx, http.MethodPost, c.url, bytes.NewReader(body), ) req.Header.Set("Content-Type", "application/json") resp, err := c.httpClient.Do(req) if err != nil { once.Do(func() { resultErr = err; cancel()}) return } defer resp.Body.Close() if resp.StatusCode >= 500 { once.Do(func() { resultErr = fmt.Errorf("server error") cancel()}) return } c.sentCount.Add(1) time.Sleep(time.Second) }(msg) } wg.Wait() }
Koks yra msg tipas gorutinoje ir kodėl jį reikia perduoti kaip argumentą?
/* Programuotojui buvo pavesta parašyti pranešimų siuntimo paslaugą. Reikalavimai: - Send metodas turi siųsti žinutes lygiagrečiai. - Vienu metu negali būti vykdomi daugiau nei maxworkers HTTP užklausų. - Jei bent viena siuntimas nepavyksta, kiti turi būti sustabdyti ir grąžintas klaidos pranešimas. - Metodas turi teisingai tvarkyti konteksto atšaukimą. - Visi ištekliai turi būti teisingai atlaisvinti. - Metodas gali būti kviečiamas konkurencingai iš skirtingų gorutinių. - Klientas turi stebėti sėkmingai išsiųstų žinučių skaičių. Reikia atlikti kodo peržiūrą, rasti problemas ir pataisyti kodą.
Kur reikia daryti defer resp.Body.Close()?
Kokia yra jūsų bendra komercinė patirtis su Go kūrime?
Ar bus patogu dirbti su technine dokumentacija anglų kalba?
Papaskink man apie VisusĮrankius — kodėl atėjai ir kodėl išėjai?
Ar turite susitarimų su kitais darbdaviais ar dar esate interviu etapų procese?
Kokia tavo patirtis su SQL? Ar mokate rašyti ir optimizuoti užklausas?
Kas yra greiti žaidimai?
Kur baigiasi kontekstai šiame kode?
Kas nutiks, jei užklausos į duomenų bazę metu nepateiksite konteksto?
sentCount perduodamas be sinchronizacijos — kaip tai ištaisyti?
Ką ieškai naujame projekte? Kokios technologijos tave domina? Ko nenorėtum matyti naujame darbo vietoje?
Kodėl resultErr nėra grąžinamas tiesiogiai iš goroutine?
Kada indeksas nepadeda arba netgi pakenkia?
Kokios dažniausiai yra CI/CD pipeline etapai (stages) Go paslaugai?