Sobes.tech

/* Има приложение с архитектура на микросервизи. Микросервисът може да бъде абстрахиран чрез интерфейса Backend. За достъп до една инстанция на микросервиз, може да се използва типът BackendImpl, който вече е реализиран. За всеки микросервиз има няколко десетки работещи екземпляра, всеки от които е достъпен по свой адрес addr. Въпреки това, отделните екземпляри на микросервиза не са надеждни: те могат да се сринат, да бъдат недостъпни или претоварени. Затова трябва да реализирате тип Balancer, който също реализира интерфейса Backend и извършва балансировка на натоварването от страна на клиента между екземплярите на микросервиза, като всеки път **избира най-малко натоварения** екземпляр.

159

Кой беше най-големият обем данни, с който сте работили, и колко заявки за четене/запис имаше?

158

Можеш ли накратко да разкажеш за своя опит? Кой е основният език за програмиране, който използваш? Колко години опит имаш в индустриалната разработка?

157

Защо решихте да използвате LLM вместо просто логика в кода?

157

Какво е предимството на JWT пред съхранението на сесии на сървъра?

156

Как се обработват съобщенията, изпратени на потребители в офлайн режим?

155

func Pipe(p Producer, c Consumer) error { // TODO buf := make([]any, 0, MaxItems) cookies := make([]int, 0) flush := func() error { if len(buf) == 0 { return nil } if err := c.Process(buf); err != nil { return err } for _, cookie := range cookies { if err := p.Commit(cookie); err != nil { return err } } buf = buf[:0] cookies = cookies[:0] return nil } for { items, cookie, err := p.Next() if err != nil { flush() return err }

153

Колко памет е отделена първоначално за буфера?

153

Кой е основният ти език за програмиране? Използваш ли C++ или Python?

153

Защо извикването на backend.Invoke беше извън мьютекса?

152

Опишете алгоритъма за решаване на задачата maxSegment

152

Какво ще се случи, ако Consumer.Process върне грешка — данните от буфера няма да се загубят?

150

Балансировачът трябва да разбира, че бекендът отговаря с грешки, и при превишаване на прага за определено време, да го изключва от балансировката (Circuit Breaker)

150

// код за функцията best() // с обработка на грешки при липса на наличен бекенд

149

Дадена е низ S, необходимо е да се преброят броя на поднизовете в този низ, които съдържат всички символи от този низ поне веднъж. Примери: "abca" -> 3 // abc, bca, abca "aa" -> 3 // aa, a, a, "ffg" -> 2 // ffg, fg

149

Това е низ от символи. Намерете броя на двойките индекси i и j (i <= j), между които, включително, няма повтарящи се символи. За низа "aba" отговорът е 5: [0, 0] ("a") [0, 1] ("ab") [1, 1] ("b") [1, 2] ("ba") [2, 2] ("a") За низа "acbb" отговорът е ?:

147

Какъв е максималният брой заявки в секунда, който в момента можете да обработите при висока натовареност?

147

Кои програмиране езици, освен Go, използвате за себе си или в търговската разработка?

147

Къде живееш, къде се намираш?

145

// TODO backends []*BackendImpl index int mu sync.Mutex func (b *Balancer) Invoke(ctx context.Context, req Request) (Response, error) { 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) b.mu.Lock() defer b.mu.Unlock() b.index += 1 return resp, err } // addr съдържа ip:port на конкретен екземпляр func NewBackend(addr string) *BackendImpl // addrs съдържат адресите на всички балансирани екземпляри func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImpl, len(addrs)) for _, addr := range addrs { backends = append(backends, NewBackend(addr)) } return &Balancer{ backends: backends, } }

144
/11