Архитектура
C4 Component — компоненты API
ER Diagram — база данных
Sequence — поток загрузки и анализа фото
Описание потока данных
Загрузка фото
- Клиент отправляет файл через
POST /api/v1/photos/
- API валидирует: тип (
image/jpeg, image/png), размер (≤3 МБ), magic bytes
- API сохраняет запись в PostgreSQL со статусом
uploading
- API загружает файл в MinIO по ключу
photos/{id}/original.{ext}
- API обновляет статус на
pending
- API публикует событие в Kafka (топик
photo-uploaded)
- Клиенту возвращается
202 Accepted
Анализ фото (Worker)
- Worker потребляет событие из Kafka
- Worker захватывает фото (optimistic lock:
UPDATE ... WHERE status=pending)
- Worker читает оригинал из MinIO
- Worker вызывает внешний gRPC анализатор:
- Детекция лиц (
faces_count)
- Детекция закрытых глаз (
eyes_closed_count)
- Оценка размытия (
is_blurred, blur_score)
- Перцептивный хеш (
perceptual_hash)
- Доминантный цвет (
dominant_color)
- Теги (
tags)
- Версия модели (
model_version)
- Worker вычисляет SHA256 и перцептивный хеш (своя реализация)
- Worker генерирует preview (JPEG, max 800px width)
- Worker загружает preview в MinIO
- Worker сохраняет все результаты анализа в БД
- Worker проверяет дубликаты и идентичные фото:
- Идентичные: точное совпадение SHA256 → общая группа
identity
- Дубликаты: перцептивный хеш с расстоянием Хэмминга < 20 → общая группа
duplicate
- Если не удалось связаться с анализатором — до 4 повторных попыток
- После 5-й неудачи — статус
failed