System Design с Валерием Бабушкиным | Выпуск 1 | Собеседование | karpov.courses
Разбор задачи проектирования глобального URL shortener в формате System Design-собеседования. Участники рассчитывают ключевое пространство, память и нагрузку, а затем строят масштабируемую архитектуру сервиса.
Это учебное System Design-собеседование: Валерий Бабушкин интервьюирует ученика 11 класса Алексея, которого автор описания называет победителем международного детского конкурса по ИИ AIIJC. На задаче глобального сервиса коротких ссылок они проходят путь от требований и расчёта ёмкости ключей до выбора между усечённым хешем и заранее сгенерированными ключами без коллизий. Затем собеседники оценивают объём хранения и QPS, проектируют таблицы свободных и занятых ключей, кэш, балансировщики, репликацию и локальные буферы ключей.
В System Design сначала зафиксируйте ограничения: срок жизни ссылок, соотношение чтений и записей, SLA по задержке, географию пользователей и ожидаемый объём данных.
При допущении 1 млн новых ссылок в день и TTL два года в упражнении получают около 8×10^8 активных ключей; ёмкость пространства ключей нужно сравнивать с этой оценкой с запасом.
Ключ из 8 символов алфавита Base64 даёт 64^8 = 2^48 вариантов, поэтому в обсуждаемой модели его ёмкости достаточно; уменьшение ключа экономит место, но сокращает запас вариантов.
Усечение хеша, например MD5 до 48 бит, повышает риск коллизий. Альтернатива из ролика — заранее создать уникальный пул ключей и атомарно переводить ключ из свободных в занятые.
Для пула ключей полезно отделить свободные ключи от занятых: из первой структуры ключ берётся за O(1), а во второй хранятся ключ, исходный URL и время истечения.
Для частых переходов по короткой ссылке нужен путь cache → хранилище → заполнение cache; при масштабировании добавляются географическая маршрутизация, load balancer, реплики и безопасная выдача локально забуференных ключей.