Skip to content

Louffty/prod-individual

Repository files navigation

README

Все enpoint'ы которые не указаны в ридми, можно посмотреть в файле individual prod.postman_collection.json и они являються стандартными ка по сваге

Описание проекта

Данный проект представляет собой микросервисную архитектуру с использованием Docker и Docker Compose. Включает в себя:

  • Backend-сервис (prod-backend)
  • Воркеры рекламы (ads-worker)
  • Бот Telegram
  • Аналитическую платформу Superset
  • Хранилище MinIO
  • Очередь сообщений Kafka
  • Кэш Redis
  • Балансировщик Nginx

Архитектура микросервисов

Основной сервис: prod-backend

prod-backend реализует основную бизнес-логику и отвечает за обработку данных. Написан на Golang с использованием Fiber и GORM.

Воркеры рекламы: ads-worker

Рекламные воркеры (ads-worker) используются для показа рекламных объявлений. Архитектура позволяет динамически добавлять любое количество воркеров, при этом нагрузка равномерно распределяется между всеми активными воркерами. Данные о просмотрах и взаимодействиях пользователей с рекламными объявлениями хранятся в Redis для быстрого доступа. Воркеры рекламы, обрабатывают показы рекламы и отправляют статистику в Kafka.

Рекламные воркеры отправляют статистику о показанных объявлениях в Kafka в качестве консюмеров. Основной сервис (prod-backend) затем обрабатывает эти данные в фоновом режиме для получения более точной аналитики. Такой подход позволяет:

  • Избежать задержек в расчётах на воркерах.
  • Минимизировать нагрузку на сервисы, выполняющие показ рекламы.
  • Оптимизировать обработку больших объёмов данных с помощью Kafka.

Модерация рекламных текстов

В системе реализована возможность модерации рекламных текстов с помощью чёрного списка. Фильтр можно включать и отключать по необходимости, а также добавлять слова для блокировки нежелательного контента. Такой механизм помогает поддерживать качество размещаемых объявлений и предотвращать публикацию запрещённого контента.

  • POST {{base_url}}/filter/toggle — включение/отключение фильтра. body: {"enabled": true}
  • POST {{base_url}}/filter/word — добавление слова в чёрный список. body: {"added": "слово"}
  • POST {{base_url}}/filter/word — удаление слова из чёрного списка. body: {"added": "слово"}

Генерация рекламных текстов

Маленький микросервис на питоне, с ипользованием либы от Sberbank, который генерирует тексты для рекламы на основе описания товара. Для упрощения создания рекламных кампаний реализована генерация текстов на основе их описания с использованием LLM GigaChat. Это позволяет автоматизировать процесс создания объявлений и повысить их качество за счёт интеллектуального анализа входных данных.

  • POST {{base_url}}/advertisers/set_ad_text — генерация текста объявления. body: {"description": "описание", "campaign_id": "32ecdd5b-62ad-4328-8231-aed5e6a0bdea"}

Хранилище изображений MinIO

В проекте используется MinIO как распределённое хранилище изображений для рекламных объявлений. Это обеспечивает удобное хранение, доступ и быструю обработку мультимедийных данных.

  • POST {{base_url}}/advertisers/:uuid/campaigns/upload — загрузка изображения. body: {"photo": "изображение"}

Возвращает публичный url на изображение

Если захотите полазить по админке, то вот данные для входа:

  • USER: minioadmin
  • PASSWORD: minioadmin

Она лежит на порту 9001

Просмотр статистики

Для просмотра статистики используется Superset. Перейдите в браузере по адресу http://localhost:8088, войдите в систему и откройте дашборд с аналитикой.

Так как автоматический импорт дашборда в Superset не реализован, необходимо импортировать его вручную. Он просто отказывался я правда пытался. Файл с экспортированным дашбордом прилагается в виде ZIP-архива. Чтобы импортировать его:

Данные от админки Superset:

  • USER: admin
  • PASSWORD: admin
  1. Перейдите в раздел "Dashboard" -> "Import Dashboards". dashboard_export_20250221T190945.zip

img_5.png

  1. Нажать на кнопку со стрелочкой.

img_6.png

  1. Выберите предоставленный ZIP-архив и загрузите его.

img_7.png

  1. И ввести пароль от бд это postgres
  2. Дальше можно открывать и смотреть на него красивого

img_2.png

Запуск проекта

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

docker compose up -d --build

Описание docker-compose.yml

Файл docker compose.yml содержит следующие сервисы:

  • prod-database — база данных PostgreSQL.
  • prod-backend — основной бэкенд-сервис.
  • ads-worker-1, ads-worker-2 — воркеры обработки рекламы.
  • redis — кэш Redis.
  • zookeeper и kafka — брокер сообщений Kafka.
  • minio и minio-init — S3-хранилище MinIO.
  • superset — аналитическая платформа для визуализации данных.
  • tg-bot — Telegram-бот.
  • nginx — балансировщик нагрузки.

Демонстрация работы

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

Схема данных СУБД

В проекте используется PostgresSQL. Основные таблицы:

Вся схема субд доступна по ссылке:

https://drawdb.vercel.app/editor?shareId=8447dd07b2bee2f6c8ada419dc128285

img.png

Основные точки входа

Backend API

Коллекция запросов для Postman прилагается в репозитории для удобного тестирования API.

individual prod.postman_collection.json

Telegram-бот

Написан на п*итоне ничего интересно просто обычный бот

@prod_individual_bot

Telegram-бот используется как альтернатива веб-интерфейсу для рекламодателей. Он позволяет:

  • Зарегистрироваться в системе.
  • Создавать рекламные кампании.
  • Получать агрегированную статистику по объявлениям.

Доступные команды:

  • /start — запуск бота.

img_3.png img_4.png

Диаграммы и схемы

Диаграмма взаимодействия сервисов

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

https://drive.google.com/file/d/13v2I_ftyKnxAP8CQQuErcNFjEANZfcf9/view?usp=sharing

img_1.png

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

Тесов у меня кот наплакал если честно, есть парочка unit тестов, для сервисов бекенда, /solution/backend/internal/domain/services/services_test Поэтому чтобы загладить свою вину, я написал стресс тесты для воркеров, которые можно найти в /solution/stress_test

К слову у меня на машине выдерживал 500rps и 7 миллисекунд ответа, я старался

Фичи которые к сожалению были вырезаны

У меня была классная система снэпшотов, которая позволяла сохранять состояние редиса и восстанавливать его, но из-за небольших неполадок с тестовой системой, она была отклчена ((

Также были еще идеи как более для productuon-ready системы, но увы, тестовой системе это бы не понравилось Хотел сделать как с ситилинке полчуени рекламных компаний таргету, но первая мог бы быть дилей между обновлением компании и кэшем Так что это могло бы приводить к ошибкам в тестовой, вот

Заключение

Я очень устал и не хочу больше писать, но проект получился крутым и я доволен им. Спасибо за внимание!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors