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

Yandex / Яндекс (Processor/Scheduler)

Актуальность: 1 кв 2026

  • быстро принимать входные задания;
  • отдавать результат задания по запросу;
  • если результата нет, возвращать соответствующий статус.

Задача: Процессор - сервис, который выполняет долгую ресурсоемкую операцию. Он уже реализован. Возвращаемые им ошибки связаны исключительно с некорректными входными данными, устойчивы и перезапрашивать их бесполезно. go/errors-panic

Заголовок раздела «Задача: Процессор - сервис, который выполняет долгую ресурсоемкую операцию. Он уже реализован. Возвращаемые им ошибки связаны исключительно с некорректными входными данными, устойчивы и перезапрашивать их бесполезно. go/errors-panic»
type Processor interface {
Process([]byte) ([]byte, error)
}

Задача: Считаем, что у нас есть генератор уникальных идентификаторов (например, UUID). Генератор гарантирует, что коллизий не будет. go/maps

Заголовок раздела «Задача: Считаем, что у нас есть генератор уникальных идентификаторов (например, UUID). Генератор гарантирует, что коллизий не будет. go/maps»
type ID string
// func NewID() ID

Шедулер принимает от клиентов задачи, ставит в очередь и запускает в процессинг:

  • обеспечивает, что единовременно запущено не более threads методов process;
  • дает возможность проверить статус задачи и получить результат;
  • не блокирует методы своего публичного интерфейса на процессинг.
type Scheduler struct {
processor Processor
}
func NewScheduler(
prc Processor,
threads int,
) Scheduler {
// todo initialization logic
return Scheduler{
processor: prc,
}
}
func (s *Scheduler) Queue(request []byte) ID {
// todo implement
return ""
}
func (s *Scheduler) Status(id ID) (status string, result []byte, err error) {
// todo implement
return
}

Задача: Для сохранения данных в нашем распоряжении есть быстрое персистентное хранилище, которое описывается интерфейсом. По сути БД. Хранилище может делать Create/Update, поиск конкретной записи по primary key, и поиск набора записей по критериям. Можно добавить в конструктор шедулера. architecture/patterns

Заголовок раздела «Задача: Для сохранения данных в нашем распоряжении есть быстрое персистентное хранилище, которое описывается интерфейсом. По сути БД. Хранилище может делать Create/Update, поиск конкретной записи по primary key, и поиск набора записей по критериям. Можно добавить в конструктор шедулера. architecture/patterns»
type FindOperator struct {
Key, Operator, Value string // ограничение на value - 255 символов
// пример "<birthplace ", "=", "Moscow ">, "<birthdate ", ">", "2000-01-01 ">
}
type Storage[T any] interface {
Store(T, *ID) ID // выполняет Upsert, если ID не передан то генерирует его
Get(ID) T
FindIDs([]FindOperator) []ID
}