/* Dani je niz znakova. Nađite broj parova indeksa i i j (i <= j), između kojih nema ponovljenih znakova. Za niz "aba" odgovor je 5: mogu biti ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
Golang
Máte skúsenosti s podporou alebo vývojom distribuovaných systémov?
Použili ste verejné cloudové služby? Ak áno, s ktorými poskytovateľmi a službami?
Ako pracujete na architektúre — je v tíme architekt, platforma, výbor?
Ako rýchlo bude fungovať lineárne prehľadávanie všetkých backendov pri vysokom RPS (napríklad 30 000 RPS a 10 backendov)?
Ako rýchlo skontrolovať, či sú v okne všetky znaky (porovnanie dvoch máp)?
type Balancer struct { // TODO backends []*BackendImpl index int mu sync.Mutex N int K time.Duration } var _ Backend = &Balancer{} func (b *Balancer) Invoke(ctx context.Context, req Request) (Response, error) { if len(b.backends) == 0 { return nil, fmt.Errorf("Počet backends v slice 0") } b.mu.Lock() index := b.index for b.backends[index].banned { b.index = (b.index + 1) % len(b.backends) index = b.index } b.index = (b.index + 1) % len(b.backends) b.mu.Unlock() backend := b.backends[index] resp, err := backend.Backend.Invoke(ctx, req) if err != nil && backend.countErrors < b.N { backend.mu.Lock() backend.countErrors += 1 if backend.countErrors == b.N { backend.banned = true go func() { time.Sleep(b.K) backend.mu.Lock() defer backend.mu.Unlock() backend.banned = false backend.countErrors = 0 }() } backend.mu.Unlock() } return resp, err } // addrs съдържат адресите на всички балансирани инстанции func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImplF, len(addrs)) for _, addr := range addrs { implF := BackendImplF{ Backend: NewBackend(addr), } backends = append(backends, &implF) } }
Aký bol najväčší objem údajov, s ktorým ste pracovali v databázach?
Na koľkých hostiteľoch bežal servis a koľko inštancií sa spustilo?
/** :-))) :-(( "ab :-)" = "ab " "ab :-)))" = "ab " "ab :-)))(" = "ab (" "ab ):-)" = "ab )" ":-)" = "" **/ func deleteP(str string) string { n := len(str) res := make([]byte, 0, n) i := 0 for i < n { if str[i] == ':' && str[i+1] == '-' && (str[i+2] == ')' || str[i+2] == '(') { ch := str[i+2] i += 2 for i < n && str[i] == ch { i++ } } else { res = append(res, str[i]) } } return string(res) }
Ako sú aktívne vyhľadávania? Možno už existujú nejaké ponuky?
Povedz mi viac o svojom prvom mieste práce od 2019 do 2021.
Existujú jednoduchšie a rýchlejšie spôsoby vyváženia záťaže namiesto výberu najmene zaťaženého backendu?
Koľko ľudí sa zúčastnilo na najväčšom projekte, na ktorom ste pracovali? Menej ako desať, desiatky, státisíce?
Ako riešiť problém obmedzenia paralelných požiadaviek v distribuovanom systéme s viacerými inštanciami, ak používateľ musí čakať namiesto toho, aby dostal chybu?
Nájdite syntaktické chyby v opravenom kóde
Pre API Gateway jeden Load Balancer, pre WebSocket iný — celkovo dva LB v systéme?
Prečo správy z Message Service idú priamo cez gRPC, nie cez Kafka?
func countSubs(s string) int { result := 0 left := 0 hm := make(map[rune]int) for right := 0; right < len(s); right++ { hm[s[right]]++ for hm[s[right]] > 1 { hm[s[left]]-- if hm[s[left]] == 0 { delete(hm, s[left]) } left++ } result += (right - left + 1) } return result }
Implementujte metódu BulkCreateUsers na základe proto súboru: vytvorte štruktúru projektu, biznis logiku, úložisko a SQL dopyty v súlade s princípmi SOLID