Golang
/ * * Дан массив целых чисел и число X, * требуется найти самый длинный непустой подотрезок, минимум на котором равен X. * Верните длину такого подотрезка или -1, если таких подотрезков нет. * /
/* Нам нужно передать данные из некоторого источника некоторому потребителю. При этом источник отдает данные небольшими пачками (~ десятки записей), а потребитель оптимальнее работает с крупными батчами Реальный пример - поставка данных из очередей типа Kafka в базу Clickhouse. Источник: - Условно бесконечный. - Источник никогда не возвращает более MaxItems записей за один вызов Next. - В рамках одной "сессии" (одного вызова функции Pipe) источник каждый раз возвращает новые данные на каждый вызов Next. - Однако, после перезапуска источник начнет с прошлой "подтвержденной" позиции, задаваемой cookie. Поэтому *каждое* значение cookie, которое вернул вызов Next, после сохранения данных в приемнике, должно быть фиксировано вызовом Commit, причем строго в той же последовательности, в которой их вернул Next Приемник: - Не может обработать более MaxItems за один раз. Базовый уровень: Требуется реализовать функцию func Pipe(p Producer, c Consumer) error которая читает данные из источника, группирует их в буфер размером не более MaxItems и сохраняет в приемник, после чего фиксирует прогресс в источнике. */ const MaxItems = 9999 type Producer interface { // Next returns: // - batch of items to be processed // - cookie to be commited when processing is done // - error Next() (items []any, cookie int, err error) // Commit is used to mark data batch as processed Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { var buf []any var cookies []int for { items, cookie, err := p.Next() if err != nil { return err } buf = append(buf, items...) cookies = append(cookies, cookie) if len(buf) >= MaxItems { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } buf = buf[:0] cookies = nil } } if len(buf) > 0 { if err := c.Process(buf); err != nil { return err } for _, c := range cookies { if err := p.Commit(c); err != nil { return err } } } return nil }
// Задача 4 // У "типичного" CRUD сервиса - в какой-то момент некоторые методы стали работать медленно и сервис начал таймаутить. // сервис состоит из: // * Application Load Balancer (L7) - прием входящих запросов и терминрование tls // * Backend (rest, java/kotlin или golang) - обработка входящих запросов и бизнес логика // * Database (postgres) - хранение и обработка sql запросов // Как правильно действовать чтобы понять причину проблем и выработать решения для улучшения ситуации?
По статусу поиска: насколько активно рассматриваешь предложения, есть ли офферы, каков дедлайн по их принятию и сроки перехода?
В чём плюсы и минусы двух сценариев: добавление тасков до запуска пула и после запуска пула?
Расскажите про транзакционную модель PostgreSQL: ACID, MVCC, уровни изоляции.
Почему хотели бы сменить место работы?
Доработай решение для топ-10 по каждому namespace с учётом того, что сервисы могут быть в разных кластерах, но в одном namespace (нужно объединять)
Расскажите про миграции базы данных — как они хранились и кто их писал?
Какой цвет объектов удаляется в конце работы сборщика мусора?
С observability как обстоят дела, что сможешь рассказать?
""" Места в кинотеатре расположены в один ряд. Только что пришедший зритель выбирает место, чтобы сидеть максимально далеко от остальных зрителей в ряду. То есть расстояние от того места, куда сядет зритель до ближайшего к нему зрителя должно быть максимально. Гарантируется, что в ряду всегда есть свободные места и уже сидит хотя бы один зритель. Напишите функцию, которая по заданному ряду мест (массиву из нулей и единиц) вернёт расстояние (число промежутков между креслами) от выбранного места до ближайшего зрителя. [1, 0, 0, 0, 1] -> 2 [1, 0, 1, 0, 0, 1, 0, 0, 1] -> 2 [1, 0, 1, 0] -> 1 """
Что такое CPU-bound и I/O-bound задачи?
Расскажи подробнее о проекте в Авито — это был единственный проект за три года?
На что смотришь в EXPLAIN при анализе запроса?
Как распараллелить обработку логов с использованием worker pool? Как получать результаты из горутин?
Что произойдёт, если запустить 5 триллионов горутин? Как оптимизировать?
Может ли указатель указывать и на стек, и на кучу?
Расскажи про проектирование шины/оркестратора модерации — как проектировали, какие решения принимали?
С какими неочевидными проблемами параллельности (горутин) ты сталкивался на реальных проектах и как их лечил?