ivfisunov / banner-rotator

Final project. OTUS Golang Professional course

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

golangci tests build

Общее описание

Сервис "Ротация баннеров" предназначен для выбора наиболее эффективных (кликабельных) баннеров, в условиях меняющихся предпочтений пользователей и набора баннеров.

Предположим, что на сайте есть место для показа баннеров (слот) и есть набор баннеров, которые конкурируют за право показа в этом месте. Набор баннеров постоянно обновляется - добавляются новые, старые удаляются. Так же у пользователя меняются предпочтения - если им показывать все время один и тот же баннер, пользователь перестает его замечать. Задача сервиса - осуществлять "ротацию" баннеров, показывая те, которые наиболее вероятно приведут к переходу.

Для этого предполагается использовать алгоритм "Многорукий бандит":

Кроме того пользователи неоднородны - их можно условно разделить на социально-демографические группы. В разных группах пользователей могут быть разные предпочтения.

Архитектура

Сервис состоит из API и базы данных Postgres в которой хранится информация о баннерах. Сервис должен предоставлять REST API.

Описание сущностей

Слот

Слот - место на сайте, на котором мы показываем баннер.

  • ID
  • Описание

Баннер

Баннер - рекламный/информационный элемент, который показывается в слоте.

  • ID
  • Описание

Один баннер может участвовать в ротации в нескольких слотах.

Статистика по баннеру ведется в рамках одного слота.

Соц-дем. группа пользователей

Соц-дем. группа - это группа пользователей сайта со схожими интересами, например "women" или "men".

  • ID
  • Описание

Описание методов

Добавить баннер

Добавляет новый баннер в ротацию в данном слоте.

  • ID баннера
  • ID слота

Удалить баннер

Удаляет баннер из ротации в данном слоте.

  • ID слота
  • ID баннера

Засчитать переход

Увеличивает счетчик переходов на 1 для указанного баннера в данном слоте в указанной группе.

  • ID слота
  • ID баннера
  • ID соц-дем. группы

Выбрать баннер для показа

Основной метод. Возвращает баннер который следует показать в данный момент в указанном слоте для указанной соц-дем. группы. Увеличивает число показов баннера в группе.

Принимает:

  • ID слота
  • ID соц-дем. группы

Возвращает:

  • ID баннера

Развертывание

Развертывание микросервиса должно осуществляться командой make run (внутри docker compose up) в директории с проектом.

Тестирование

Алгоритм "многорукого бандита" рекомендуется выделить в отдельный модуль и покрыть unit-тестами.

При тестировании необходимо проверить сценарии:

  • Перебор всех: после большого количества показов, каждый баннер должен быть показан хотя один раз.
  • Выбор популярных: если на один из баннеров кликают, у него должно быть существенно больше показов чем у остальных.

About

Final project. OTUS Golang Professional course


Languages

Language:Go 96.3%Language:Makefile 2.0%Language:Dockerfile 1.7%