Общее описание
Сервис "Ротация баннеров" предназначен для выбора наиболее эффективных (кликабельных) баннеров, в условиях меняющихся предпочтений пользователей и набора баннеров.
Предположим, что на сайте есть место для показа баннеров (слот) и есть набор баннеров, которые конкурируют за право показа в этом месте. Набор баннеров постоянно обновляется - добавляются новые, старые удаляются. Так же у пользователя меняются предпочтения - если им показывать все время один и тот же баннер, пользователь перестает его замечать. Задача сервиса - осуществлять "ротацию" баннеров, показывая те, которые наиболее вероятно приведут к переходу.
Для этого предполагается использовать алгоритм "Многорукий бандит":
Кроме того пользователи неоднородны - их можно условно разделить на социально-демографические группы. В разных группах пользователей могут быть разные предпочтения.
Архитектура
Сервис состоит из 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-тестами.
При тестировании необходимо проверить сценарии:
- Перебор всех: после большого количества показов, каждый баннер должен быть показан хотя один раз.
- Выбор популярных: если на один из баннеров кликают, у него должно быть существенно больше показов чем у остальных.