tur Response interfeysi {} tur Backend interfeysi { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr ma'lum bir nusxaning ip:port manzilini o'z ichiga oladi func NewBackend(addr string) *BackendImpl tur Balancer tuzilmasi { // TODO backends []*BackendImpl index int mu sync.Mutex } var _ Backend = &Balancer{} func (b *Balancer) Invoke(ctx context.Context, req Request) (Response, error) { agar len(b.backends) == 0 { return nil, fmt.Errorf("Backends ro'yxatida elementlar soni 0") } b.mu.Lock() index := b.index agar 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 barcha balanslangan nusxalarning manzillarini o'z ichiga oladi func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImpl, len(addrs))
Golang
Yandeksning multitrek dasturi haqida nima bilasiz?
API Gateway uchun bir Load Balancer, WebSocket uchun boshqacha — jami tizimda ikki LB?
Jamoat bulutlaridan foydalangansizmi? Agar ha, qaysi ta'minotchilar va xizmatlar bilan?
Arxitektura ustida qanday ishlaysiz — jamoada arxitektor, platforma, komitet bormi?
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("Backends soni 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 barcha balanslangan instansiyalar manzillarini o'z ichiga oladi func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImplF, len(addrs)) for _, addr := range addrs { implF := BackendImplF{ Backend: NewBackend(addr), } backends = append(backends, &implF) } }
Yuqori RPS (masalan, 30 000 RPS va 10 backend) bilan barcha backendlarni chiziqli qidirish qanday tezlikda ishlaydi?
Qanday qilib oynada barcha belgilar borligini tezda tekshirish mumkin (ikki xaritani taqqoslash)?
Qidiruvlar qanchalik faol? Balki, allaqachon takliflar bormi?
Siz ishlagan eng katta loyihada nechta odam ishtirok etdi? Oltitadan kam, o'nlarcha, yuzlarcha?
/** :-))) :-(( "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-yildan 2021-yilgacha bo'lgan birinchi ish joyingiz haqida batafsilroq aytib bering.
Xizmat qaysi hostinglarda ishlagan va nechta instansiya ishga tushirilgan?
Ma'lumotlar bazalarida ishlash davomida eng katta ma'lumot hajmi nima edi?
Yukni eng kam yuklangan backendni tanlash o'rniga, yukni muvozanatlash uchun yanada oddiy va tezroq usullar bormi?
Nima uchun Message Service xabarlar to'g'ridan-to'g'ri gRPC orqali yuboriladi, Kafka orqali emas?
Bir nechta instantsiyaga ega bo'linadigan tarqatilgan tizimda parallel so'rovlar cheklovini qanday hal qilish mumkin, agar foydalanuvchi xato olish o'rniga kutishi kerak bo'lsa?
Tuzilgan kodda sintaktik xatolarni toping
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-faylga asoslangan holda BulkCreateUsers metodini amalga oshiring: loyiha tuzilmasi, biznes mantiqi, repository va SQL so'rovlarini SOLID tamoyillariga muvofiq yarating