Important
В рамках данных задач стоит амбициозный и креативный проект по созданию сервиса коротких ссылок, который удобно вписывается в современный веб-ландшафт. Наш сервис будет принимать на вход стандартные REST запросы, содержащие оригинальные URL-адреса, и выдавать в ответ компактные, укороченные версии с использованием домена localhost. Пользователи, перейдя по такой короткой ссылке, будут автоматически перенаправлены на изначальный, полный адрес ресурса.
Note
В качестве образца можно рассматривать сервисы типа https://surl.li/ru, которые демонстрируют функционал и потенциал сокращения ссылок.
В результате проектных работ ожидается:
- Подробное архитектурное описание с тщательным анализом каждого принятого решения. Здесь будут освещены такие аспекты, как причины выделения функциональности в отдельный микросервис, выбор способа коммуникации – Kafka/GRPC, логика за выбором определённого типа базы данных, и другие ключевые моменты.
- Полноценная реализация сервиса, отвечающая всем поставленным требованиям и стандартам качества. Не забудьте написать тесты для вашего проекта.
- Docker compose файл, содержащий все необходимые настройки для быстрого и безболезненного запуска сервиса в любой среде.
- Документация интерфейса сервиса, включающая в себя спецификацию REST запроса для генерации короткой ссылки и прочие важные детали взаимодействия с сервисом.
- Для поданного URL'а на ресурс, сервис генерирует уникальный сокращенный URL.
- При использовании сокращенного URL'a, пользователья редиректит на оригинальный ресурс.
- HA
- Сервис должен быть расширяемым и эффективным
- Для улучшения пользовательского опыта, прикрутить фронтенд
Warning
- Какова ожидается нагрузка на сервис в месяц (сколько ссылок)?
- Должны ли ссылки существовать вечно? Если нет то какой их lifespan?
- Должны ли собираться метрики с переходов по ссылкам? Если да то какие?
- Должен ли каждый пользователь получать уникальную сокращённую ссылку на ресурс?
- Должна ли присутствовать фича создания кастомного url?
- Будет ли сервис использоватсья во всем мире?
- Бизнесс требования,
- сколько у нас есть денег?
- сколько мы готовы ждать?
- как долго планируется поддерживать решения? Деградация функциональности, чем можем пожертвовать?
Tip
— Что за бизнес, $ука? kizaru ft Барбарики
Используется "трёх" звеньевая архитектура - нужны разные ресурсы сервиса.
- Фронтенд, первичная валидация и безопасность; защита от
- Шифрование
- 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, автаматически дискаверящий сервисы будь то контейнеры или поды
Caution
Балансировка на уровне кубера Фронт продаем клиенту
# start DockerCompose Infra
make up
# stop DockerCompose Infra
make down
Warning
Kind не может в External IP Using MetalLb with Kind METALLB MetalLB and NGINX Ingress // Setup External Access for Kubernetes Applications
Warning
HashiCorp moment? We have to hire CloudOps and add
- vault
- consul
- waypoint
- boundary
- terraform (have to write terraform modules for each cloud provider)
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
erDiagram
short_to_long {
string short_url
string long_url
}
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