type Response interface{} type Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr нақты экземплярдың ip:port-ін қамтиды func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO backends []*BackendImpl index int mu sync.Mutex } var _ Backend = &Balancer{} func (b *Balancer) Invoke(ctx context.Context, req Request) (Response, error) { if len(b.backends) == 0 { return nil, fmt.Errorf("Backends саны 0") } b.mu.Lock() index := b.index if b.index + 1 == len(b.backends) { b.index = 0 index = 0 } b.mu.Unlock() resp, err := b.backends[index].Invoke(ctx, req) return resp, err } // addrs барлық балансқа салынатын экземплярлардың мекенжайларын қамтиды func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImpl, len(addrs))
Golang
Сізде таралған жүйелерді қолдау немесе дамыту тәжірибесі бар ма?
Қоғамдық бұлттарды қолдандыңыз ба? Егер иә болса, қандай провайдерлер мен қызметтер?
Сіз архитектураны қалай өңдейсіз — командада архитекторыңыз бар ма, платформа, комитет?
type Balancer құрылымы { // 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("Backends саны слайсте 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, 0, len(addrs)) for _, addr := range addrs { implF := BackendImplF{ Backend: NewBackend(addr), } backends = append(backends, &implF) } return &Balancer{ backends: backends, } }
Жоғары RPS кезінде (мысалы, 30 000 RPS және 10 артқы жағы бар) барлық артқы жағын сызықтық іздеу қаншалықты тез жұмыс істейді?
Терезеде барлық таңбалар бар-жоғын қалай тез тексеруге болады (екі картаны салыстыру)?
Жұмыс іздеу қаншалықты белсенді? Қандай ұсыныстар бар ма?
Дерекқорлармен жұмыс істеген кезде ең үлкен деректер көлемі қандай болды?
2019 жылдан 2021 жылға дейінгі алғашқы жұмысыңыз туралы толығырақ айтыңыз.
/** :-))) :-(( "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) }
Қызмет қанша хостта жұмыс істеді және қанша инстанс іске қосылды?
Жүктемесі ең аз серверді таңдау орнына қарапайым әрі жылдамырақ жүктемені теңестіру әдістері бар ма?
API Gateway үшін бір жүктеме теңгергіш, ал WebSocket үшін басқа — жүйеде екі жүктеме теңгергіш бар ма?
Сіз жұмыс істеген ең үлкен жобаға қанша адам қатысқан? Оннан аз, ондар, жүздер ме?
Түзетілген кодта синтаксистік қателерді табыңыз.
Көп инстанциялармен бөлінген жүйеде параллель сұрауларды шектеу мәселесін қалай шешуге болады, егер пайдаланушы қате алмай, күтуі керек болса?
Неліктен 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 принциптерін сақтай отырып жасаңыз.