Golang
Zašto Go? Odakle si počeo, kako si došao do ovog jezika?
Koje primitivne sinhronizacije gorutina postoje u Go?
Ispričaj o map u Go.
Ažuriranja dokumenata stižu u servis message Document { string Url = 1; // URL dokumenta, njegov jedinstveni identifikator uint64 PubDate = 2; // deklarisano vreme objavljivanja dokumenta uint64 FetchTime = 3; // vreme primanja ove ažuriranja dokumenta, može se smatrati identifikatorom verzije. Par (Url, FetchTime) je jedinstven. string Text = 4; // tekst dokumenta uint64 FirstFetchTime = 5; // inicijalno nedostaje, treba popuniti } Dokumenti mogu stizati u bilo kom redosledu (ne u redosledu u kojem su ažurirani), i mogu postojati duple poruke. Potrebno je na izlazu formirati iste poruke, ali sa ispravljenim poljima prema sledećim pravilima (sve niže važi za grupu dokumenata sa istim poljem Url): Polje Text i FetchTime treba da budu takvi kakvi su u dokumentu sa najvećim FetchTime koji je do sada primljen. Polje PubDate treba da bude takvo kakvo je u poruci sa najmanjim FetchTime. Polje FirstFetchTime treba biti jednako minimalnoj vrednosti FetchTime. Drugim rečima, u svakom trenutku uzimamo PubDate i FirstFetchTime od prve verzije primljene do sada (ako ih sortiramo po FetchTime), a Text od poslednje. Interfejs u kodu može biti implementiran ovako: type Processor interface { Process(doc *Document) (*Document, error) } Ovaj kod će raditi u servisu koji čita poruke iz reda (Kafka ili slično), i takođe zapisuje rezultat u red. Ako Process vrati Null, ništa se ne zapisuje u red.
Kako ste uticali na promenu procesa sa analizom?
Чиме сте најчешће радили? Које технологије сте користили?
Можеш ли да обрадиш панику у једном од defer-ова?
Kako će se Redis i Postgres sinhronizovati? Uostalom, mogu se razlikovati.
Šta je tracing? Kako ga voditi?
Koje je vaše ukupno iskustvo u komercijalnom razvoju u Go?
главни пакет увоз ( "io" "log" "net/http" ) функција handler(w http.ResponseWriter, r *http.Request) { го func() { resp, err := http.Get("[link]") ако err != nil { лог.Println("грешка у захтеву:", err) return } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) w.Write(body) }() } func main() { http.HandleFunc("/proxy", handler) log.Fatal(http.ListenAndServe(":8080", nil)) }
Koji stil Saga su koristili: koreografiju ili orkestraciju?
Kako postavljate prioritete između novih funkcija, tehničkog duga i ispravki grešaka?
Kada ne možemo uhvatiti paniku, da li će se aplikacija i dalje zatvoriti?
Seti se situacije kada si zapao u ćošak i nisi znao kako da rešiš problem
Šta je defer i zašto se koristi? U kom redosledu se izvršavaju defer pozivi ako ih ima više u istoj funkciji?
Koje metrike proizvoda prikupljate?
Šta će se desiti ako je defer van goroutine, a ne unutar nje?
Prema CV, trenutno radite u [organizacija], da ли је то тачно?
/* Postoji aplikacija s arhitekturom mikroservisa. Mikroservis se može apstrahirati pomoću sučelja Backend. Za pristup primjerku mikroservisa, možete koristiti tip BackendImpl, koji je već implementiran. Svaki mikroservis ima nekoliko desetaka pokrenutih primjeraka, od kojih je svaki dostupan putem svoje adrese addr. Međutim, pojedinačni primjerci mikroservisa nisu pouzdani: the mogu pasti, biti nedostupni ili preopterećeni. Stoga morate implementirati tip Balancer, koji također implementira sučelje Backend i vrši balansiranje opterećenja na strani klijenta između primjeraka mikroservisa, birajući svaki put **najmanje opterećen** primjerak. */ type Request interface{} type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr sadrži ip:port određenog primjerka func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO } var _ Backend = &Balancer{} // addrs sadrže adrese svih uravnoteženih primjeraka func NewBalancer(addrs []string) *Balancer { // TODO }