Перейти к основному содержимому

Архитектурный анализ ArtHunt

Дата: Апрель 2026
Статус: MVP (v1.0, запуск 01.07.2026)
Стек: Go/Gin · PostgreSQL · MongoDB · Elasticsearch · RabbitMQ

Требования

Функциональные (MVP)

ДоменКлючевые требования
AuthРегистрация email+password, OAuth (VK/Google/Яндекс), JWT, подтверждение email
СпециалистыПрофиль, портфолио (≥3 работ), теги, ценовой диапазон
КлиентыСоздание проектов, поиск специалистов, прямые приглашения
МатчингОтклики (1 на проект/специалист), приглашения (1 на клиент/специалист/проект)
ПоискПолнотекстовый + тег-фильтры (стиль, жанр, техника, настроение, цвет, формат)
МодерацияОчередь проверки портфолио и проектов, блокировка пользователей
ПоддержкаТикет-система, уведомления по email

Нефункциональные

ТребованиеЦелевое значениеПриоритет
Поиск< 2 сек при 100 конкурентных запросахВысокий
Доступность99.9% uptimeВысокий
БезопасностьХешированные пароли, авторизация всех эндпоинтовВысокий
СоответствиеФЗ-152 (персональные данные)Высокий
МасштабируемостьГоризонтальное масштабированиеВысокий
НаблюдаемостьЛогирование событий, алерты на отказыСредний

Оценка нагрузки (3 мес после запуска)

MAU: ~650 пользователей (500 специалистов + 150 клиентов)
Проекты: ~45 в месяц (30% клиентов × 150)
Отклики: ~300 в месяц (~6-7 на проект)
Поисковые запросы: ~2 000 в месяц (консервативно)
Медиафайлы: ~6 000 файлов в портфолио (500 спец. × 12 работ)
RPS (пик): ~5-10 req/s — это низкая нагрузка для MVP
Вывод

Для MVP нагрузка незначительна. Архитектурные решения нужно оценивать с позиции операционной сложности, а не масштабируемости.

Текущая архитектура

┌─────────────────────────────────────────┐
│ Клиент (Browser) │
└──────────────────┬──────────────────────┘
│ HTTPS
┌──────────────────▼──────────────────────┐
│ Nginx (API Gateway) │
│ TLS termination · Rate limit · Proxy │
└──────────────────┬──────────────────────┘

┌──────────────────▼──────────────────────┐
│ Go / Gin (Monolith API) │
│ auth · specialists · projects · search │
│ responses · invitations · moderation │
└──────┬───────┬────────┬──────┬──────────┘
│ │ │ │
┌───────────▼─┐ ┌──▼───┐ ┌▼─────┴──┐ ┌──────────────┐
│ PostgreSQL │ │Mongo │ │ Open │ │ RabbitMQ │
│ основные │ │ DB │ │ Search │ │ async tasks │
│ сущности │ │ │ │ индекс │ │ email/notifs │
└─────────────┘ └──────┘ └──────────┘ └──────────────┘

Будущая архитектура

┌─────────────────────────────────────────────────┐
│ Клиент (Browser) │
└──────────────────────┬──────────────────────────┘
│ HTTPS
┌──────────────────────▼──────────────────────────┐
│ CDN (Yandex/VK Cloud / Cloudflare) │
│ статика, медиафайлы │
└────────────┬─────────────────┬───────────────────┘
│ API requests │ media
┌────────────▼────────────┐ ┌▼─────────────────┐
│ Nginx (API Gateway) │ │ Object Storage │
│ TLS · RateLimit · Proxy │ │ S3 / MinIO │
└────────────┬────────────┘ └──────────────────┘

┌────────────▼────────────────────────────────────┐
│ Go / Gin (Monolith API) │
└───┬──────────┬──────────┬──────────┬────────────┘
│ │ │ │
┌──────────▼──┐ ┌───▼──┐ ┌───▼──────┐ ┌▼─────────────┐
│ PostgreSQL │ │Redis │ │Elasticsrc│ │ RabbitMQ │
│ Основная БД │ │Cache │ │ Search │ │ Очереди │
└─────────────┘ └──────┘ └──────────┘ └──────┬───────┘

┌──────────▼───────┐
│ Worker (Go) │
│ email, ES sync │
└──────────────────┘

Анализ компонентов

Go + Gin

Плюсы: высокая конкурентность (goroutines), быстрая компиляция, production-ready фреймворк.

Риски: небольшая команда требует аккуратности с error handling, нет встроенного ORM.

PostgreSQL vs MongoDB

Проблема

MongoDB в текущей архитектуре практически не нужен для MVP. Все данные имеют чёткую реляционную структуру. Использование MongoDB создаёт операционную сложность без пользы.

Elastic/Opensearch

Правильное решение — теговая фильтрация является ключевым конкурентным преимуществом. Обеспечивает полнотекстовый поиск, фасетную фильтрацию, нечёткий поиск.

Риск: нужна стратегия синхронизации данных (паттерн Outbox + RabbitMQ).

RabbitMQ

Используется для email-уведомлений, обновления ES-индекса, логирования аналитики. Нужна Dead Letter Queue стратегия.

Компромиссный анализ

РешениеПлюсыМинусыРекомендация
Монолит (Go)Просто, быстро, 1 репозиторийСложнее масштабировать частиПравильно для MVP
PostgreSQLACID, JOIN-ы, надёжностьВертикальное масштабированиеДостаточно для MVP
MongoDBГибкость схемыЛишняя сложность, нет ACIDУбрать из MVP
ElasticsearchМощный поискEventual consistency, сложностьНеобходим
RabbitMQНадёжные очередиЕщё один сервисОправдан
RedisКеш, JWT revokeЕщё один сервисДобавить
Object StorageМедиафайлыКритично добавить

Приоритизированные доработки

Критично (до запуска MVP)

  1. Object Storage — MinIO или Yandex Object Storage. Без него нельзя хранить медиа портфолио.
  2. Redis — JWT blacklist (logout), кеш тегов и профилей.
  3. ES-синхронизация — Outbox + RabbitMQ consumer.

Важно (первые 2 недели после запуска)

  1. Версионирование API — добавить /api/v1/ префикс.
  2. Observability — Prometheus + Grafana + алерты.
  3. Dead Letter Queue в RabbitMQ.

Для v2.0

  1. CDN — раздача медиа при росте трафика.
  2. Rate limiting — защита auth-эндпоинтов от брутфорса.