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}