Sobes.tech

Golang

տիպ 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))

187

/* Տրված է նիշերի տող: գտնել i և j ցուցանիշների զույգերի քանակը (i <= j), որոնց միջև կրկնվող նիշեր չկան: "aba" տողը պատասխանն է 5: կարող են լինել ASCII [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") */

187

Դուք օգտագործե՞լ եք հանրային ամպեր: Եթե այո, ապա ինչ մատակարարներ և ծառայություններ?

185

Ինչպե՞ս եք աշխատում ճարտարապետության վրա — կա՞ ճարտարապետ թիմում, հարթակ, հանձնաժողով։

184

Ի՞նչ արագությամբ կաշխատի բոլոր backend-ների գծային որոնումը բարձր RPS (օրինակ՝ 30 000 RPS և 10 backend) դեպքում։

183

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) } }

183

API Gateway-ի համար մեկ Load Balancer, WebSocket-ի համար ուրիշ — ընդհանուր երկու LB համակարգում?

183

Ինչպե՞ս արագ ստուգել, որ պատուհանում բոլոր նշաններն են (երկու քարտաների համեմատություն):

182

/** :-))) :-(( "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) }

180

Ի՞նչ էր տվյալների ամենամեծ ծավալը, որի հետ եք աշխատել տվյալների բազաներում։

180

Ի՞նչ չափով են ակտիվ որոնումները: Միգուցե արդեն կան որոշ առաջարկներ։

180

Խնդրում եմ մանրամասնորեն պատմեք ձեր առաջին աշխատանքը 2019-ից 2021 թվականներին։

180

Որքան հոստում էր աշխատում ծառայությունը և քանի ինստանցիա էր գործարկվում?

180

Կա՞ ավելի պարզ և արագ միջոցներ բեռի հավասարակշռության համար՝ փոխարենը ամենաքիչ բեռնված backend-ը ընտրելու։

179

Ինչու Message Service հաղորդումները ուղիղ gRPC-ով են գնում, ոչ թե Kafka-ով?

178

Քանի մարդ էր ներգրավված ձեր աշխատած ամենամեծ նախագծում? Փոքր քան տասը, տասնյակ, հարյուրավոր?

178

Գտեք սինտաքսական սխալներ ուղղված կոդում

177

Ինչպես լուծել միաժամանակյա հարցումների սահմանափակման խնդիրը բաժանված համակարգում մի քանի օրինակներով, եթե օգտվողը պետք է սպասի, փոխարենը սխալ ստանալու։

177

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 }

176

Կատարեք BulkCreateUsers մեթոդը proto ֆայլի հիման վրա՝ ստեղծելով նախագծի կառուցվածքը, բիզնես տրամաբանությունը, պահոցը և SQL հարցումները՝ հետևելով SOLID սկզբունքներին

175
/11