К основному содержимому
к интервью
краткая расшифровка интервью2022Fellow

Техническое интервью: Архитектурная секция

Архитектурная секция C++ Russia 2022: Александр Поломодов интервьюирует Владимира Иванова, который девять лет работает в 2ГИС и последние пять лет делает кроссплатформенное мобильное приложение на C++, а с высоконагруженным бэкендом напрямую не сталкивался. Вдвоём они проектируют сервис загрузки и просмотра видео, а затем разбирают, как такая беседа оценивается.

C++ Russia 20226 минут

Конспект собран по описанию материала в каталоге. По ссылкам ниже — запись.

Основная линия материала
01

Упрощённый YouTube и рамки задачи

Задачу сформулировали как упрощённый YouTube: заливка видео, просмотр и лента подписок с оповещением подписчиков о новинках. Кандидат сразу уточнил цифры: 10 миллионов пользователей в день, каждый десятый заливает одно видео в сутки, каждый смотрит около десяти, средняя подписка — на сотню каналов. Ограничения на контент — не больше гигабайта на файл и четыре качества, включая 480; для видео с плохим оригиналом верхние качества просто недоступны.

Границы очертили быстро. Клиентскую часть вынесли за скобки — проектируется публичный бэкенд-API, а как им пользуются мобильные разработчики, остаётся их заботой. Аналитика, мониторинг, юридические вопросы, аутентификация и авторизация тоже ушли из рассмотрения: интервьюер прямо сказал, что модельная задача урезана специально, чтобы её можно было нормально обсудить за час. Граф подписок договорились считать внешним сервисом, а вот собранная лента — уже часть проектируемой системы.

02

От заливки файла до ленты подписчика

Схема росла итеративно. Пользователь приносит файл кусками в объектное хранилище, компрессор забирает исходник, готовит все разрешения и складывает результат отдельно от оригинала; видео считается готовым, когда собраны все размерности. Отдельная база метаданных связывает загруженный файл с автором, а лента подписчика собирается заранее, на запись: как только видео готово, его идентификатор разносят по лентам всех подписчиков, потому что ждать сборку в момент открытия ленты пользователь не станет.

Прикидка нагрузки: если каждый обновляет ленту раз пять в день, получается около 50 миллионов запросов в сутки, и делить их удобнее не на 86 400, а на круглые сто тысяч секунд. Отдельный спор вышел про CDN. Кандидат хотел поставить перед ним сервис, отдающий ссылку на видео; интервьюер возразил, что собственной ответственности у такого компонента не вырисовывается — ссылку проще собрать прямо в ответе ленты, а маршрутизацию к ближайшей точке CDN сделает сам.

03

Где интервьюер увидел слабые места

Главным замечанием стала связка между компрессором и базой. Кандидат предложил периодически выбирать из таблицы видео без пометки о сжатии и забирать их в работу, сам назвав идею так себе. Интервьюер согласился: это очередь, собранная из базы данных, со статусной моделью и периодическим опросом изменений — на определённом масштабе такое работает, но остаётся рудиментом. Уместнее брокер сообщений, где много компрессоров параллельно разбирают независимые задачи, а выполненная задача просто исчезает и никого не блокирует.

Дальше пошли детали, которые выдают опыт. Исходники после сжатия не нужны, но удалять их одним лишь вызовом из компрессора рискованно: без внешней сборки мусора и записи в базе непонятно, что потерялось по дороге. Шардирование лент по идентификатору пользователя работает из коробки и ломается разве что на чересчур активных аккаунтах. Вопрос про супер-популярные каналы отложили на конец и до него не дошли. Итог: на концептуальных этапах хорошо, на конкретных решениях слабее, но достаточно, чтобы мобильный разработчик был полезен в кросс-функциональной команде.

Выводы

Что стоит унести с собой

  1. 01Параметры такой задачи подбирают так, чтобы где-то стало узко: много данных, много запросов или нетривиальный процесс — иначе улучшать в решении просто нечего.
  2. 02Периодический опрос таблицы по флажку статуса — это очередь, собранная не из того; брокер сообщений даёт параллельную обработку независимых задач.
  3. 03Компонент, у которого не вырисовывается собственная ответственность, лишний: ссылку на CDN проще отдать сразу вместе с лентой, не заставляя клиента делать лишний шаг.
  4. 04Нарисовать кубики мало — интервьюер ждёт, что кандидат вернётся и связно расскажет, как данные проходят систему от публичной ручки до результата на экране.

Источники

Поделиться
TelegramLinkedIn