Все enpoint'ы которые не указаны в ридми, можно посмотреть в файле individual prod.postman_collection.json и они являються стандартными ка по сваге
Данный проект представляет собой микросервисную архитектуру с использованием Docker и Docker Compose. Включает в себя:
- Backend-сервис (prod-backend)
- Воркеры рекламы (ads-worker)
- Бот Telegram
- Аналитическую платформу Superset
- Хранилище MinIO
- Очередь сообщений Kafka
- Кэш Redis
- Балансировщик Nginx
prod-backend реализует основную бизнес-логику и отвечает за обработку данных. Написан на Golang с использованием Fiber и GORM.
Рекламные воркеры (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 как распределённое хранилище изображений для рекламных объявлений. Это обеспечивает удобное хранение, доступ и быструю обработку мультимедийных данных.
- POST {{base_url}}/advertisers/:uuid/campaigns/upload — загрузка изображения. body: {"photo": "изображение"}
Возвращает публичный url на изображение
Если захотите полазить по админке, то вот данные для входа:
- USER: minioadmin
- PASSWORD: minioadmin
Она лежит на порту 9001
Для просмотра статистики используется Superset. Перейдите в браузере по адресу http://localhost:8088, войдите в систему и откройте дашборд с аналитикой.
Так как автоматический импорт дашборда в Superset не реализован, необходимо импортировать его вручную. Он просто отказывался я правда пытался. Файл с экспортированным дашбордом прилагается в виде ZIP-архива. Чтобы импортировать его:
- USER: admin
- PASSWORD: admin
- Перейдите в раздел "Dashboard" -> "Import Dashboards". dashboard_export_20250221T190945.zip
- Нажать на кнопку со стрелочкой.
- Выберите предоставленный ZIP-архив и загрузите его.
- И ввести пароль от бд это
postgres - Дальше можно открывать и смотреть на него красивого
Для запуска всех сервисов используйте команду:
docker compose up -d --buildФайл 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
Коллекция запросов для Postman прилагается в репозитории для удобного тестирования API.
individual prod.postman_collection.json
Написан на п*итоне ничего интересно просто обычный бот
@prod_individual_bot
Telegram-бот используется как альтернатива веб-интерфейсу для рекламодателей. Он позволяет:
- Зарегистрироваться в системе.
- Создавать рекламные кампании.
- Получать агрегированную статистику по объявлениям.
Доступные команды:
/start— запуск бота.
Тут показано как выглядит архитектура проекта, редис являться связующим звеном между воркерами и бекендом, а кафка между воркерами и бекендом (только для статы) Если вдруг кэш упадет, то воркеры смогут обрабатывать показы просто дольше, а если кафка упадет, то бекенд не сможет обрабатывать стату
https://drive.google.com/file/d/13v2I_ftyKnxAP8CQQuErcNFjEANZfcf9/view?usp=sharing
Тесов у меня кот наплакал если честно, есть парочка unit тестов, для сервисов бекенда, /solution/backend/internal/domain/services/services_test Поэтому чтобы загладить свою вину, я написал стресс тесты для воркеров, которые можно найти в /solution/stress_test
К слову у меня на машине выдерживал 500rps и 7 миллисекунд ответа, я старался
У меня была классная система снэпшотов, которая позволяла сохранять состояние редиса и восстанавливать его, но из-за небольших неполадок с тестовой системой, она была отклчена ((
Также были еще идеи как более для productuon-ready системы, но увы, тестовой системе это бы не понравилось Хотел сделать как с ситилинке полчуени рекламных компаний таргету, но первая мог бы быть дилей между обновлением компании и кэшем Так что это могло бы приводить к ошибкам в тестовой, вот
Я очень устал и не хочу больше писать, но проект получился крутым и я доволен им. Спасибо за внимание!







