Сервис сегментирования пользователей
В Авито часто проводятся различные эксперименты — тесты новых продуктов, тесты интерфейса, скидочные и многие другие. На архитектурном комитете приняли решение централизовать работу с проводимыми экспериментами и вынести этот функционал в отдельный сервис.
Требуется реализовать сервис, хранящий пользователя и сегменты, в которых он состоит (создание, изменение, удаление сегментов, а также добавление и удаление пользователей в сегмент)
- Клонируем репозиторий проекта:
git clone https://github.com/LinqCod/avito-internship-2023.git
- Дальше необходимо запустить само приложение. Сервис обернут в докер контейнер, для развертывания которого использовался
docker-compose
. Помимо контейнера с самим сервисом поднимается также контейнер базы данных (использовался postgres), хранящий в себе таблицы пользователей, сегментов, их связки, а также истории добавления/удаления пользователя из сегмента.
Для запуска сервиса достаточно использовать команду make service-up
, которая сбилдит и запустит приложение, доступное на порту 8080:
make service-up
Для завершения работы сервиса следует воспользоваться командой:
make service-down
- Сервис представлен в виде HTTP RESTful API, с использованием JSON для отправки и получения данных.
- Ошибки отправляются в формате JSON ({"error": "message"}) с соответствущим статус кодом.
- Реализована поддержка Swagger для работы с API - для использования необходимо перейти по URL:
http://localhost:8080/docs/index.html
.
Ниже предоставлена информация по основным эндпоинтам, а также несколько примеров взаимодействия с API.
- POST /api/v1/users - Создание пользователя
- GET /api/v1/users/{id} - Получение пользователя по id
- GET /api/v1/users - Получение всех пользователей
- POST /api/v1/users/{id}/changeSegments - Добавление и удаление сегментов пользователя
- GET /api/v1/users/{id}/active - Получение активных сегментов пользователя
- GET /api/v1/users/{id}/{month}/{year} - Получение csv файла с историей изменения сегментов пользователя
- POST /api/v1/segments - Создание сегмента
- DELETE /api/v1/segments/{slug} - Удаление сегмента по имени
Для тестирования апи был выбран Postman.
Добавление сегмента (поля описания и процента пользователей, к которым необходимо автоматически добавить сегмент опциональны):
Получение активных сегментов пользователя:
Изменение сегментов пользователя:
- Старался по максимуму использовать лучшие практики при разработке
- Процесс разработки происходил посредством работы с GitFlow (для каждой новой фичи создавалась отдельная ветка)
- Использовал подход написания чистой архитектуры с использованием паттерна repository
- Использовал Docker и docker-compose для контейнеризации, а также оптимизировал production контейнер
Для упрощения и оптимизации разработки сервиса старался следовать известным мне практикам написания чистой архитектуры. Грамотное разбиение проекта на слои транспорта, сервиса и репозитория позволили мне значительно уменьшить время разработки проекта.
Были реализованы все задания, включая основное и три дополнительных.
- Во втором задании столкнулся с проблемой понимания "активного сегмента" пользователя. При написании сервиса было принято решение трактовать активный сегмент как любой сегмент, который был добавлен пользователю в методе изменения его сегментов, а также сегменты, имеющие TTL параметр, который при этом еще не истек. При реализации решил не мудрить с удалением неактивных сегментов, поскольку, возможно, эти данные могут пригодится аналитикам например, и, по этой причине, в решении второго задания те сегменты, время активности которых завершилось, не удаляются из базы, в место этого в методе получения активных сегментов пользователя просто пропускаются (реализованно в sql запросе).
К сожалению, изза нехватки времени не успел дельным образом реализовать важные моменты, связанные с оптимизацией и тестированием кода, но в дальнейшем можно будет добавить следующее:
- Наладить тестирование сервиса
- Добавить в сервис механизм миграции БД
- Грамотней реализовать обработку ошибок (добавить необходимые миддлвары и врапперы ошибок)
- Добавить использование транзакций бд для оптимизации запросов
- Реализовать механизм непрерывной интеграции и развертывания (CI/CD)
- Добавить использование брокеров сообщений для оптимизации асинхронной работы сервиса