Skip to content

LinqCod/avito-internship-2023

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Avito Internship 2023

Сервис сегментирования пользователей

Основная задача

Проблема:

В Авито часто проводятся различные эксперименты — тесты новых продуктов, тесты интерфейса, скидочные и многие другие. На архитектурном комитете приняли решение централизовать работу с проводимыми экспериментами и вынести этот функционал в отдельный сервис.

Задача:

Требуется реализовать сервис, хранящий пользователя и сегменты, в которых он состоит (создание, изменение, удаление сегментов, а также добавление и удаление пользователей в сегмент)

Старт сервиса

  1. Клонируем репозиторий проекта:
git clone https://github.com/LinqCod/avito-internship-2023.git
  1. Дальше необходимо запустить само приложение. Сервис обернут в докер контейнер, для развертывания которого использовался docker-compose. Помимо контейнера с самим сервисом поднимается также контейнер базы данных (использовался postgres), хранящий в себе таблицы пользователей, сегментов, их связки, а также истории добавления/удаления пользователя из сегмента.

Команды

Для запуска сервиса достаточно использовать команду make service-up, которая сбилдит и запустит приложение, доступное на порту 8080:

make service-up

Для завершения работы сервиса следует воспользоваться командой:

make service-down

API

  1. Сервис представлен в виде HTTP RESTful API, с использованием JSON для отправки и получения данных.
  2. Ошибки отправляются в формате JSON ({"error": "message"}) с соответствущим статус кодом.
  3. Реализована поддержка 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} - Удаление сегмента по имени

Примеры ответов API:

Для тестирования апи был выбран Postman.

Добавление пользователя: Screenshot from 2023-08-31 18-25-56

Получение всех пользователей: Screenshot from 2023-08-31 18-26-14

Добавление сегмента (поля описания и процента пользователей, к которым необходимо автоматически добавить сегмент опциональны): Screenshot from 2023-08-31 18-27-02

Получение активных сегментов пользователя: Screenshot from 2023-08-31 18-27-15

Изменение сегментов пользователя: Screenshot from 2023-08-31 18-29-03

Результат изменения: Screenshot from 2023-08-31 18-30-41

Детали реализации

  • Старался по максимуму использовать лучшие практики при разработке
  • Процесс разработки происходил посредством работы с GitFlow (для каждой новой фичи создавалась отдельная ветка)
  • Использовал подход написания чистой архитектуры с использованием паттерна repository
  • Использовал Docker и docker-compose для контейнеризации, а также оптимизировал production контейнер

Архитектура

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

Возникшие вопросы

Были реализованы все задания, включая основное и три дополнительных.

  1. Во втором задании столкнулся с проблемой понимания "активного сегмента" пользователя. При написании сервиса было принято решение трактовать активный сегмент как любой сегмент, который был добавлен пользователю в методе изменения его сегментов, а также сегменты, имеющие TTL параметр, который при этом еще не истек. При реализации решил не мудрить с удалением неактивных сегментов, поскольку, возможно, эти данные могут пригодится аналитикам например, и, по этой причине, в решении второго задания те сегменты, время активности которых завершилось, не удаляются из базы, в место этого в методе получения активных сегментов пользователя просто пропускаются (реализованно в sql запросе).

Развитие сервиса

К сожалению, изза нехватки времени не успел дельным образом реализовать важные моменты, связанные с оптимизацией и тестированием кода, но в дальнейшем можно будет добавить следующее:

  1. Наладить тестирование сервиса
  2. Добавить в сервис механизм миграции БД
  3. Грамотней реализовать обработку ошибок (добавить необходимые миддлвары и врапперы ошибок)
  4. Добавить использование транзакций бд для оптимизации запросов
  5. Реализовать механизм непрерывной интеграции и развертывания (CI/CD)
  6. Добавить использование брокеров сообщений для оптимизации асинхронной работы сервиса

About

user segmentation service for avito internship 2023

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published