Golang
Что делать, если мы добавили все необходимые индексы, но база данных всё равно не справляется с нагрузкой и тормозит?
Расскажи про ClickHouse — как он хранит данные на диске (колоночное хранение), почему нельзя менять ORDER BY у существующей таблицы, только добавлять новые колонки в конец?
Вы сохраняли все сообщения из Kafka в отдельную таблицу? Какой в этом был смысл, разве Kafka была недостаточна?
Что такое слайсы в Go, как они устроены?
Были ли у вас sidecar-контейнеры на инстансах? Что такое sidecar?
Какие ещё глобальные проблемы есть в коде? Как хранить деньги — можно ли использовать float?
Что означает поле issued_at?
Если бы этот кэш использовался в реальном приложении и возникли проблемы с производительностью, как можно было бы улучшить решение?
Объясни, почему выбрано именно 16 шардов по умолчанию?
Что происходит, когда ты добавляешь элемент через append в слайс, у которого capacity уже полностью использован?
Может ли быть такое, что сообщения распределены по partition'ам неравномерно? Как с этим бороться?
Какие виды gRPC-взаимодействия вы использовали? Можете назвать их?
Как работает сборка мусора в Go?
А если нужно искать по части названия книги (подстроке)?
-- Вывести всех авторов и кол-во их книг. -- Пример: -- author_name | book_count --------------------------- -- Игорь | 2 -- Иван | 1 -- Вывести авторов, которые написали более 2-х книг.
func (p *Pool) Stop() { p.mu.Unlock() // Теперь можно безопасно закрыть канал close(p.tasks) // сигнал воркерам: новых задач не будет, дочитайте остаток p.wg.Wait() // ждём завершения всех горутин p.cancel() // отменяем контекст на всякий случай fmt.Println("Pool stopped.") } // ForceStop принудительно останавливает все воркеры без ожидания завершения задач. // Воркеры будут прерваны немедленно через контекст. func (p *Pool) ForceStop(timeout time.Duration) { fmt.Printf("Force stopping pool (timeout: %v)...\n", timeout) // Блокируем добавление новых задач p.mu.Lock() p.isOpen = false p.mu.Unlock() // Закрываем канал, чтобы воркеры не брали новые задачи close(p.tasks) // Отменяем контекст – это прервет все выполняющиеся задачи p.cancel() // Даём ограниченное время на завершение done := make(chan struct{}) go func() { p.wg.Wait() close(done) }() select { case <-done: fmt.Println("Pool force stopped (все воркеры завершены)") case <-time.After(timeout): fmt.Println("Pool force stopped (timeout, могут остаться зависшие горутины)") } }
// GetUsersList возвращает список пользователей. (в бд храним порядка 1 млн пользователей) // Используется для отображения списка пользователей в админке. Если isActive = true, то возвращаются только активные пользователи. func (u *UsersRepo) GetUsersList(ctx context.Context, isActive bool) ([]User, error) { rows, err := u.DB.Query("SELECT id, name, phone FROM users WHERE is_active = ?", isActive) if err != nil { return nil, errors.New("ошибка получения списка пользователей") } var users []User // Заполним информацию о пользователях. for rows.Next() { var user User err := rows.Scan(&user.ID, &user.Name, &user.Phone) if err != nil { return nil, err } // Получим список e-mail пользователя err, err := u.DB.QueryContext(ctx, "SELECT email FROM user_emails WHERE user_id = ?", user.ID) if err != nil { return nil, errors.New("ошибка получения списка пользователей") } var emails []string for er.Next() { var email string err := rows.Scan(&email) if err != nil { return nil, err } emails = append(emails, email) } if len(emails) != 0 { for i, e := range emails { emails[i] = strings.ToLower(e) } } user.Emails = emails // Получим информацию о профиле из апи ВКонтакте profile, err := getUserProfileFromVkApiByUserPhone(user.Phone) if err != nil { return nil, errors.New("ошибка получения списка пользователей") } user.Profile = profile users = append(users, user) } if err = rows.Err(); err != nil { return nil, errors.New("ошибка получения списка пользователей") } }
Вы строили real-time аналитику или какие цели изначально преследовали?
Что такое ld, rd := 1<<62, 1<<62 в контексте алгоритма?
-- Вывести авторов, у которых нет книг.