Перейти к содержимому

Yandex / Яндекс (балансировщик)

Актуальность: 4 кв 2025

Задача: Есть приложение с микросервисной архитектурой. Микросервис можно абстрагировать с помощью интерфейса Backend. Для доступа к одному экземпляру микросервиса можно использовать тип BackendImpl, который уже реализован. architecture/microservices

Заголовок раздела «Задача: Есть приложение с микросервисной архитектурой. Микросервис можно абстрагировать с помощью интерфейса Backend. Для доступа к одному экземпляру микросервиса можно использовать тип BackendImpl, который уже реализован. architecture/microservices»

Задача: Для каждого микросервиса есть несколько десятков запущенных экземпляров, каждый из которых доступен по своему адресу addr. Однако отдельные экземпляры микросервиса ненадежны: они могут падать, быть недоступными либо перегруженными. Поэтому вам нужно реализовать тип Balancer, который также реализует интерфейс Backend и осуществляет client-side балансировку нагрузки между экземплярами микросервиса. network/balancing

Заголовок раздела «Задача: Для каждого микросервиса есть несколько десятков запущенных экземпляров, каждый из которых доступен по своему адресу addr. Однако отдельные экземпляры микросервиса ненадежны: они могут падать, быть недоступными либо перегруженными. Поэтому вам нужно реализовать тип Balancer, который также реализует интерфейс Backend и осуществляет client-side балансировку нагрузки между экземплярами микросервиса. network/balancing»
type Request interface{}
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
}
var _ Backend = &Balancer{}
// addrs содержат адреса всех балансируемых экземпляров
func NewBalancer(addrs []string) *Balancer {
// TODO
}