Заполнить файлы .env.example
в docker/server
и docker/tests
настройки к postgresql и redis
APP_PORT= #Порт приложения
DB_USER= #Имя пользователя
DB_PASSWORD= #Пароль пользователя
DB_NAME= #Имя базы данных
DB_PORT= #Порт
CACHE_PORT= #Порт кэша
CACHE_PASSWORD= #Пароль кэша
CACHE_TTL= #Время жизни кэшируемых объектов
CACHE_MAXMEM= #Максимальный размер кэша
Переименовать их в .env
Нужен docker и docker-compose
Запустить:
make docker
- Соберет контейнер и запустит его
make docker-test
- Соберет среду для тестов и прогонит интеграционные тесты
Запустить:
make env
- Экспортирует переменные окружения (не тестовые)
make run
- Соберет проект локально и запустит приложение (бд и кэш нужно запускать отдельно)
- Docker - для контейнеризации сервиса
- PostgreSQL - в роли БД
- Redis - для кэширования частых запросов
- Docker compose - для управления несколькими контейнерами
Решение: использовать кэширование данных в Redis, находится в памяти потому скорость работы с бд значительно выше
Тут есть несколько вариантов
- Write Behind - асинхронная запись в бд, не постоянная синхронизация с бд, но быстро
- Write through - синхронная запись в бд при каждом запросе, медленнее но надежнее
Плюсы: быстрый доступ ко всем данным, доступ всегда к последней информации
Минусы: вся информация находится в оперативной памяти, что может быть достаточно затратно
- Сache prefetching - предзагрузка данных из бд, можно загружать основываясь на часто используемые запросы, паттерны запросов
Плюсы: также быстрый доступ ко всем данным и всегда последняя информация, можно использовать сложные запросы к данным
Минусы: для ускорения вся информация должна быть предзагружена в кэш
- Cache-aside - обычная работа с бд, загрузка частых запросов в кэш
Плюсы: оптимальное кэширование, загрузка данных только по необходимости, при повторном запросе скорость получения данных увеличивается т.к. уже есть в кэше
Минусы: запись идет в бд, а не кэш, данные могут быть устаревшими, но в нашем случае это подходит
Решение: т.к. на чтение будет происходить большинство запросов от пользователей и количество баннеров может быть большим, то выбор пал на Cache-aside. Разработчик может подождать, пользователь нет :)
При первичном запросе будут выполнены шаги
- Запрос к сервису
- Поиск ответа на запрос в кэше
- Получение данных из бд
- Ассинхронная запись в кэш
- Ответ на запрос
Однако при следующем запуске будут выполнены только шаги 1,2,5. Это сильно ускоряет время ответа на запрос
Для запуска линтера есть команды в make
make .install-linter
- скачает golangci-lint
make lint
- скачивает и запускает линтер с конфигурацией из файла
make lint-fast
- скачивает и запускает линтер в быстром режиме (пропускает тяжеловесные линтеры)
Все команды
make build
- собирает проект
make test
- запускает тесты
make tidy
- очищает неиспользуемые зависимости
make run
- запускает проект после сборки
make clean
- очищает собранный проект
make all
- выполняет тесты и собирает проект
make docker
- запускает проект в Docker
make docker-clear
- останавливает и удаляет контейнеры Docker
make docker-rebuild
- пересобирает и запускает проект в Docker
make docker-test
- запускает тесты в Docker
make docker-test-clear
- останавливает и удаляет контейнеры тестов в Docker
make .install-linter
- устанавливает linter
make lint
- запускает linter
make lint-fast
- запускает linter пропуская тяжеловесные проверки
make env
- устанавливает переменные окружения из файла docker/server/.env