Skip to content

Latest commit

 

History

History
195 lines (160 loc) · 11.6 KB

File metadata and controls

195 lines (160 loc) · 11.6 KB

Сервис коротких ссылок aka URL shortener

Lint Status Coverage Status

Очень всратый гофер.

Important

В рамках данных задач стоит амбициозный и креативный проект по созданию сервиса коротких ссылок, который удобно вписывается в современный веб-ландшафт. Наш сервис будет принимать на вход стандартные REST запросы, содержащие оригинальные URL-адреса, и выдавать в ответ компактные, укороченные версии с использованием домена localhost. Пользователи, перейдя по такой короткой ссылке, будут автоматически перенаправлены на изначальный, полный адрес ресурса.

Note

В качестве образца можно рассматривать сервисы типа https://surl.li/ru, которые демонстрируют функционал и потенциал сокращения ссылок.

В результате проектных работ ожидается:

  1. Подробное архитектурное описание с тщательным анализом каждого принятого решения. Здесь будут освещены такие аспекты, как причины выделения функциональности в отдельный микросервис, выбор способа коммуникации – Kafka/GRPC, логика за выбором определённого типа базы данных, и другие ключевые моменты.
  2. Полноценная реализация сервиса, отвечающая всем поставленным требованиям и стандартам качества. Не забудьте написать тесты для вашего проекта.
  3. Docker compose файл, содержащий все необходимые настройки для быстрого и безболезненного запуска сервиса в любой среде.
  4. Документация интерфейса сервиса, включающая в себя спецификацию REST запроса для генерации короткой ссылки и прочие важные детали взаимодействия с сервисом.

Описание предлагаемого решение

System Design Moment

Функциональные требования

  • Для поданного URL'а на ресурс, сервис генерирует уникальный сокращенный URL.
  • При использовании сокращенного URL'a, пользователья редиректит на оригинальный ресурс.

Нефункциональные требования

  • HA
  • Сервис должен быть расширяемым и эффективным
  • Для улучшения пользовательского опыта, прикрутить фронтенд

Warning

Вопросы?

  • Какова ожидается нагрузка на сервис в месяц (сколько ссылок)?
  • Должны ли ссылки существовать вечно? Если нет то какой их lifespan?
  • Должны ли собираться метрики с переходов по ссылкам? Если да то какие?
  • Должен ли каждый пользователь получать уникальную сокращённую ссылку на ресурс?
  • Должна ли присутствовать фича создания кастомного url?
  • Будет ли сервис использоватсья во всем мире?
  • Бизнесс требования,
    • сколько у нас есть денег?
    • сколько мы готовы ждать?
    • как долго планируется поддерживать решения? Деградация функциональности, чем можем пожертвовать?

Экономим деньги бизнесс

Tip

— Что за бизнес, $ука? kizaru ft Барбарики

Архитектура сервиса

Общее описание HighLoad решения

Используется "трёх" звеньевая архитектура - нужны разные ресурсы сервиса.

  • Фронтенд, первичная валидация и безопасность; защита от
    • Шифрование
    • DDoS
    • Медленные запросы
    • Буферизация
    • Обработка ошибок
    • Кэш
    • Балансировка
  • Бэкенд — вычисления
  • Система хранения

Микромонолит

Плюсы

  • Отсутствие какого-либо оверхеда при коммуникации сервисов.

Минусы

  • Высокая сложность разработки
  • В случае проблемы, встает всё
  • Невозможность вести распределенную разработку

Горизонтальное масштабирование/закон Амдала

Иллюстрирует ограничение роста производительности выислительной системы с увеличением количества вычислителей.

Разделяемый компонет 10 вычислителей 100 вычислителей 1000 вычислителей
0% Ускорение в 10 раз Ускорение в 100 раз Ускорение в 1000 раз
10% 5.3 9.2 9.9
25% 3.0 3.9 4.0
40% 2.1 2.4 2.5

Higload Горизонтальное масштабирование

Технологии

Caution

Vue (Vite + Bun) - прост в использовании/производителен/2 место по полюрности 2023г

Echo - расширяемый производительный фреймворк с большим кол-вом мидлварей Redis - в плане кеша конкуренты отсутствуют (Memcached ограничен, KeyDB ещё в перспективе) ClickHouse - аппенд онли дб, высокой производительности, отказоустойчивости и масштабируемости. Traefik - opensource reverse-proxy, автаматически дискаверящий сервисы будь то контейнеры или поды

DockerCompose Infra

DockerCompose Infra

Caution

Балансировка на уровне кубера Фронт продаем клиенту

# start DockerCompose Infra
make up
# stop DockerCompose Infra
make down

K8S Infra

K8s Infra

Cloud Infra?

Warning

HashiCorp moment? We have to hire CloudOps and add

  • vault
  • consul
  • waypoint
  • boundary
  • terraform (have to write terraform modules for each cloud provider)

Контракты можно тестировать в .http

POST localhost:1323/short-it HTTP/1.1
Host: localhost:1323
Content-Type: application/json
Accept: */*

{
  "long_url": "<YOUR_URL>"
}

# Returns OK (200), with the generated <SHORT_URL> in data
GET localhost:1323/short-it/<SHORT_URL> HTTP/1.1
Host: localhost:1323
Content-Type: application/json
Accept: */*

# Returns StatusFound (302) redirects user

Database Schema

erDiagram
    short_to_long {
        string short_url
        string long_url
    }
Loading

Shortening Algorithm

Important

shortuuid — generates UUIDs using google/uuid and then translate it to base57 using lowercase and uppercase letters and digits, and removing similar-looking characters such as l, 1, I, O and 0.

Собираемые Метрики

  • tbank_processed_ops_total — The total number of processed events
  • tbank_url_shortener_usage_redirect — The number of redirects
  • tbank_url_shortener_usage_create — The number of short urls creation
  • tbank_url_shortener_cache_usage — The number of cache usage
  • tbank_url_shortener_db_usage — The number of db usage
  • tbank_url_shortener_errors_total — The number of errors

Используемые зависимости и тулы

  • echo high performance, minimalist Go web framework. Task included by default
  • clickhouse-go driver for ClickHouse
  • go-redis redis client for Go
  • prometheus open-source systems monitoring and alerting toolkit
  • goose database migration tool
  • env simple and zero-dependencies library to parse environment variables into structs
  • shortuuid generates concise, unambiguous, URL-safe UUIDs that are used for shorten urls
  • swaggo automatically generate RESTful API documentation with Swagger 2.0

Откуда бралось вдохновение