Комментарии 14
из опыта - чем заморочененее собеседование тем меньше итоговая работа имет отношение к "пройденым конкурсам" )))
по задаче вы как-то не туда преусложнили. Все абсолютно верно хоть и со странными точками фокуса (про тот же алгоритм генерации uid можно было бы сразу расписать, вы и так словами все уже сказали, а вот балансировки и тд как раз вытянуть в отдельную полноценную статью с пояснениями почему так а не иначе, почему тут мы закладывваем возможность роста, а тут нет и тд).
вообще изначально кандидат должен задать вопрос "это теоретическая задача или практическая?", потому как кроме крисивой алгоритмической теории, есть скучная практика которая обычно строится на базе готовых узлов по очень многим причинам...
У вас как раз теоретическая реализация с редкими вкраплениями "на чем делать", что только сбивает общий тон.
Уже были похожие статьи, архитектура лишь малая часть, в первый же день такой сервис окажется во всех черных списках, ну и остальное.
Вы уверены что у вас реально будет 292G урлов? Сколько всего доступных сайтов в инете есть?
По идее чтобы не хранить лишнее можно было бы периодически в фоне чекать по экспоненте в течении какого-то перода доступность урлов из базы ссылок и если ссылка не отвечает, то удалять ее. Так появляется еще одна реальная причина делить систему на МСА.
Анализ незаконных ссылок легко обходится. Просто сам же владелец запрещенного сайта или первые из его посетителей сначала идут на ваш сокращатель ссылок и получает короткую версию до того, как оно вообще попадет в списки опасных, а далее тк короткая ссылка уже у вас в базе, то ничего более не проверяется и просто идет переход на опасный сайт.
292G урлов стоит понимать как теоретический максимум, вытекающий из анализа требований. По данным из https://www.techcult.ru/internet/14774-kolichestvo-sajtov-prevysilo-milliard на начало 2025 года в инете насчитывается примерно 1,1 млрд сайтов. Но, как, говорится, есть нюансы. Во-первых, активно развиваемых владельцами сайтов будет намного меньше (15-20%), а остальные, насколько я понимаю, доступны для просмотра, но информацию на них уже давно не обновляют. При этом ссылки доступны и отвечают. Во-вторых, насколько я понимаю, Вы исходите из предположения, что на один доступный URL сайта можно сделать только одну ссылку. Но есть такие ресурсы как ютуб, на котором каждое видео имеет свой урл. По оценке, опубликованной здесь https://habr.com/ru/companies/ru_mts/articles/784806/ таких урлов уже больше 13 миллиардов.
По поводу обхода анализа незаконных ссылок. Универсальной защиты от обхода придумать, скорее всего, нельзя. Но следуя Вашему предложению, можно, например, проверять уже сохраненные ссылки на попадание в список опасных и таким образом периодически чистить свою базу и кэш.
Если по какой — то причине перестанет работать генерация коротких ссылок, это не должно вывести всю систему из строя. Микросервисный подход гарантирует: пользователи продолжат переходить по уже созданным ссылкам, даже если функция создания новых временно недоступна.
Если запрос на перенаправление, то URL Redirector вначале проверяет есть ли поданный на вход короткий URL в его кэше. Если есть, то сразу происходит редирект по найденному длинному URL, иначе идет запрос на один из экземпляров URL Shortener, чтобы попытаться извлечь длинный URL из БД (URL DB Cluster). После этого осуществляется перенаправление по длинному URL с кодом 302.
Немного не понял, а если ни один инстанис URL Shortener не будет доступен и URL нет в кеше? Получается система упадет
Система не упадет. В описанном Вами случае она должна вернуть пользователю ошибку. Например, HTTP Статус 503. Service Unavailable (Сервис недоступен). Это временная проблема на стороне сервера. Она показывает, что сама ссылка, возможно, существует, но сервер сейчас не может её обработать. Ситуация недоступности URL Shortener является исключительной. Проблему поддержания нужного количества экземпляров сервисов можно решить при помощи механизма health check. Насколько я знаю, такие механизмы доступны при развертывании в облаке.
В итоге самым нагруженным местом будет бд, про которую все забыли...
Приведенная в комментарии ссылка у меня не открывается. Обращение к БД всегда происходит только при создании ссылок. Если нужно перейти по короткой ссылке, то система вначале ищет её в кэше Redis и только при отсутствии ссылки там происходит обращение к БД. Но и в этом случае можно оптимизировать нагрузку на БД путем создания реплик. Запись идет только на мастер ноду, а чтение со слейв.

System Design на практике: создаем систему сокращения ссылок от проектирования архитектуры до развертывания в облаке