топ Response интерфейс {} tоп Backend интерфейс { Invoke(ctx: контекст, req: Request): Response, error } var _ Backend = &BackendImpl{} // addr белгилүү бир мисалдын IP:порт дареги func NewBackend(addr: string) *BackendImpl tоп Balancer түзүмү { // TODO backends []*BackendImpl index int mu sync.Mutex } var _ Backend = &Balancer{} func (b *Balancer) Invoke(ctx: контекст, req: Request) (Response, error) { эгер len(b.backends) == 0 { кайтаруу nil, fmt.Errorf("Backends саны слайста 0") } b.mu.Lock() index := b.index эгер b.index + 1 == len(b.backends) { b.index = 0 index = 0 } b.mu.Unlock() resp, err := b.backends[index].Invoke(ctx, req) кайтаруу resp, err } // addrs бардык балансировкаланган мисалдардын даректерин камтыйт func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImpl, len(addrs))
Golang
Яндексдин мультитрек программасы жөнүндө эмне билесиз?
API Gateway үчүн бир Load Balancer, WebSocket үчүн башка — жалпы эки LB системадабы?
Жарандык булуттарды колдондуңузбу? Эгер ооба болсо, кайсы камсыздоочулар жана кызматтар?
Архитектура менен кантип иштешесиз — командада архитектор, платформа, комитет барбы?
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("Байланыштардын саны слайста 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) } }
Жогорку RPS (мисалы, 30 000 RPS жана 10 backend) учурда бардык backendдердин сызыктуу издөшу канчалык тез иштейт?
Терезеде бардык белгилер бар экенин кантип тез текшерсе болот (эки карта салыштыруу)?
Издөө канчалык активдүү? Мүмкүн, алгачкы сунуштар бардыр?
Эң чоң долбоордо канча адам иштеген? Ондон аз, ондон көп, жүздөгөнбү?
/** :-))) :-(( "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) }
2019-2021-жылдар аралыгында биринчи иш ордуңуз жөнүндө көбүрөөк айтып бериңиз.
Кызмат канча хостто иштеди жана канча инстанция ишке киргизилди?
Маалыматтар базаларында иштегенде эң чоң маалымат көлөмү кандай болду?
Жүктү аз эң аз жүктөлгөн backendти тандап алуудан башка, жөнөкөй жана тезирек жүктү теңдештирүү жолдору барбы?
Неге Message Service билдирүүлөрү түздөн-түз gRPC аркылуу өтүп жатат, 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 }
Proto-файлга негизделген BulkCreateUsers ыкмасын ишке ашырыңыз: долбоордун түзүмүн, бизнес логикасын, репозиторий жана SQL суроолорду SOLID принциптерин сактайт