տիպ Response ինտերֆեյս {} tիպ Backend ինտերֆեյս { Invoke(ctx: կոնտեքստ, req: Request): Response, error } var _ Backend = &BackendImpl{} // addr պարունակում է ip:port կոնկրետ օրինակի 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
/* Տրված է նիշերի տող: գտնել i և j ցուցանիշների զույգերի քանակը (i <= j), որոնց միջև կրկնվող նիշեր չկան: "aba" տողը պատասխանն է 5: կարող են լինել ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */
Դուք օգտագործե՞լ եք հանրային ամպեր: Եթե այո, ապա ինչ մատակարարներ և ծառայություններ?
Ինչպե՞ս եք աշխատում ճարտարապետության վրա — կա՞ ճարտարապետ թիմում, հարթակ, հանձնաժողով։
Ի՞նչ արագությամբ կաշխատի բոլոր backend-ների գծային որոնումը բարձր RPS (օրինակ՝ 30 000 RPS և 10 backend) դեպքում։
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("Բալանսերների քանակը 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) } }
API Gateway-ի համար մեկ Load Balancer, WebSocket-ի համար ուրիշ — ընդհանուր երկու LB համակարգում?
Ինչպե՞ս արագ ստուգել, որ պատուհանում բոլոր նշաններն են (երկու քարտաների համեմատություն):
/** :-))) :-(( "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 }
Կատարեք BulkCreateUsers մեթոդը proto ֆայլի հիման վրա՝ ստեղծելով նախագծի կառուցվածքը, բիզնես տրամաբանությունը, պահոցը և SQL հարցումները՝ հետևելով SOLID սկզբունքներին