Golang
Какими задачами больше всего гордишься, что запомнилось?
Где себя видишь дальше — в эксперта, Tech Lead, архитектора?
/* Есть приложение с микросервисной архитектурой. Микросервис можно абстрагировать с помощью интерфейса Backend. Для доступа к одному экземпляру микросервиса можно использовать тип BackendImpl, который уже реализован. Для каждого микросервиса есть несколько десятков запущенных экземпляров, каждый из которых доступен по своему адресу addr. Однако отдельные экземпляры микросервиса ненадежны: они могут падать, быть недоступными либо перегруженными. Поэтому вам нужно реализовать тип Balancer, который также реализует интерфейс Backend и осуществляет client-side балансировку нагрузки между экземплярами микросервиса, выбирая каждый раз **наименее нагруженный** экземпляр. */ 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 }
Расскажите про работу с Docker и Kubernetes: что приходилось делать?
В чём отличие между уровнями изоляции транзакций?
// Написать асинхронный обработчик задач как библиотеку // Клиент передаёт на вход некоторый объект (Task) с данными для выполнения задачи, // в нашем примере будем использовать пустую структуру. // Обработчик одновременно может обрабатывать не более N задач, // и не более X задач могут быть поставлены в очередь на обработку. // Если нет места в очереди, сразу возвращаем клиенту ошибку. // Задача берется в обработку если имеются на это свободные обработчики. // Иммитируем длительность обработки через time.Sleep(5*time.Second). // Как только очередная задача выполнилась - берём следующую задачу из очереди. // Если в очереди пусто, ожидаем новых задач от клиентов. // Со звездочкой: дополнить структуру Task и получать статусы задач, через отдельный запрос package scheduler type Scheduler interface { AddTask(t Task) error Close() } type Task interface { Do() }
Что такое партиционирование и шардирование? Использовали ли?
Как сделать валидатор строки не более 250 символов?
Есть функция `unpredictableFunc()`, нужно обернуть её так, чтобы она выполнялась с таймаутом (например, 1 секунда), и логировалось время выполнения. // Есть функция, работающая неопределённо долго и возвращающая число. // Её тело нельзя изменять (представим, что внутри сетевой запрос). func unpredictableFunc() int64 { rnd := rand.Int63n(5000) time.Sleep(time.Duration(rnd) * time.Millisecond) return rnd } // Нужно изменить функцию обёртку, которая будет работать с заданным таймаутом (например, 1 секунду). // Если "длинная" функция отработала за это время - отлично, возвращаем результат. // Если нет - возвращаем ошибку. Результат работы в этом случае нам не важен. // // Дополнительно нужно измерить, сколько выполнялась эта функция (просто вывести в лог). // Сигнатуру функцию обёртки менять можно. func predictableFunc() int64 { return unpredictableFunc() }
Для каких сценариев можно использовать context.WithValue?
Какие антипаттерны существуют в Go? Что нельзя делать, что считается плохим тоном?
Как гарантировать доставку событий при нестабильной сети (сеть может обрываться, события нельзя терять)?
Что такое GOMAXPROCS? Что будет, если задать очень большое число?
Как договариваетесь с соседними командами по контрактам — protobuf, event-контракты, в чём разница?
Насколько активный сейчас поиск? Уже собрались уходить из [компания] или пока просто присматриваетесь к интересным предложениям?
Что знаешь про нас как про продукт?
Что такое ACID? С какими базами данных работал?
Что такое индекс и какие типы индексов есть в PostgreSQL?
Где завершаются контексты в данном коде?
Работали ли с PostgreSQL, MongoDB, ClickHouse и другими базами данных?