Daniil Dyachenko's blog.

Design of the Short-URL-Service


Functional requirements

Non-functional requirements

Database scheme

Что необходимо хранить:

database scheme

Сколько будет занимать одна запись?

В сумме выходит, что самая длинная запись будет составлять 5+2048+8+16=2077 байт.

Calculations

Database

Дано:

Тогда:

Hash

В промежуточных вычислениях выше было выяснено, что всего записей будет 600 млн. Это означает, что сервис должен уметь генерировать такие уникальные короткие ссылки, чтобы вероятность коллизии была равна 0 или приближалась к этому значению.

Скажем, что наш алфавит будет состоять из букв английского языка в нижнем и верхнем регистрах, а также из цифр от 0 до 9. Что составит 62 уникальных символа в алфавите.

Тогда нам необходимо возводить число 62 в степень все выше и выше, пока итоговое число не превысит 600 млн.

Возьмем 62^5 и получим 916 132 832 уникальных комбинации. Этого вполне достаточно для нашей задачи.

Cache

API

Create

Redirect

Database

Для хранения 1160 Гб данных подойдет любая современная база данных.

Возьмем PostgreSQL.

Для ускорения запросов на поиск сделаем индекс по колонке short_url.

Для обеспечения отказоустойчивости добавим две асинхронные реплики.

Удаления старых данных

Для этого реализуем планировщик задач, который будет раз в сутки удалять все записи из базы данных, у которых значение current_time - created_at ≥ 100 лет.

Cache

Для кэширования 1,23 Гб можем взять практически любой кэш. В данном случае возьмем Redis.

В качестве стратегии записи в кэш выберем Read-Through для кэширования только тех записей, которые запрашиваются.

В качестве алгоритма вытеснения записепй из кэша возьмем Least Frequently Used (LFU) для удаления наименее часто используемых записей.

Load balancer

Типы балансировщиков, которые возьмем:

Стратегии балансировщиков, которые возьмем:

Top-level design

top level design