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

Требования

Функциональные требования

Обработка фотографий

  • Подписываться на событие PhotoPublished из PhotoService
  • Создавать локальную запись фотографии
  • Запускать распознавание согласно настройкам альбома
  • При асинхронной обработке - результаты забирать из Callback
  • При создании Callback - отвечать вызывающему сервису (Athlete) сразу после сохранения колбека, без ожидания, без предварительной обработки колбека, без ошибок
  • Обрабатывать колбеки асинхронно (в фоне)

Провайдеры распознавания

Лица:

  • VkVision — синхронное распознавание только лиц
  • Athlete — асинхронное распознавание лиц и номеров одним запросом

Номера:

  • Athlete — автоматическое распознавание
  • Ручное тегирование через TagatorService

Стратегии распознавания

  • Только авто — автоматическое распознавание без ручного тегирования
  • Только ручное — только ручное тегирование
  • Сначала авто, потом ручное — при плохом результате авто отправляется на ручное
  • Авто и ручное — параллельное авто и ручное тегирование
  • Отключено — распознавание не выполняется

Дополнительные параметры:

  • Распознавание лиц опционально (может быть отключено)
  • Возможность переключения между VkVision и Athlete для лиц
  • Разрядность номеров
  • Нормализация номеров

Валидация результатов

  • Фильтровать результаты по стартовому списку (оставлять только существующие номера)
  • При плохом результате авто-распознавания отправлять на ручное тегирование
  • Для Athlete: если номеров нет (или в будущем — если количество номеров ≠ количеству лиц после валидации) — создавать задачу ручного тегирования
  • Тегатор может использовать другие фото альбома для сопоставления лиц и номеров

Смена стратегии распознавания

  • Не перебирать все фотографии альбома
  • Обрабатывать только фото, требующие распознавания согласно новой стратегии
  • Хранить признаки состояния распознавания на записи фото (например, FaceRecognized, NumberRecognized)
  • Останавливать текущий процесс и продолжать новый без повторной обработки уже распознанных данных

Приоритеты обработки

  • Приоритет должен работать для всех типов распознавания (лица, номера, ручное тегирование). Требование будет выполнено позже.

Дополнительные функции

  • Сохранить поддержку кастомных тегов (AlbumCustomTag)
  • Распознавание по селфи
  • Передача PhotographerId и ShootingDate в TagatorService

Интеграционные требования

Athlete

  • Передавать recognition type = FACE_NUMBER для одновременного распознавания лиц и номеров
  • Принимать асинхронный callback с результатами persons и tags
  • Выполнять один запрос на фото для получения обоих типов данных

PhotoService

  • Отправлять распознанные персоны (лица)
  • Отправлять теги (номера)

TagatorService

  • Создавать задачи ручного тегирования
  • Отменять задачи при удалении фото (PhotoDeleted)
  • Передавать данные фотографа и даты съемки

CompetitorService

  • Обращаться к нужному инстансу CompetitorService в зависимости от настроек проекта. Будет реализовано позже. Сейчас - обращаться к существующему инстансу CompetitorService.

Требования к данным

Хранение

  • Снизить дублирование данных между сервисами
  • Определить, какие данные требуются длительно, какие можно удалять
  • Реализовать агрегацию данных для отчетов
  • Настроить автоматическое удаление устаревших данных

Синхронизация

  • При удалении фото отменять связанные задачи тегирования
  • При удалении тегов в PhotoService удалять их в TagatorService
  • При удалении плохой работы тегатора переназначать фото другому тегатору

Требования к производительности

Оптимизация обработки

  • Убрать промежуточный статус Processing
  • Выполнять максимум полезной работы между чтением и записью в БД
  • Обрабатывать фото сразу при получении события
  • При ошибке планировать повторную обработку через Hangfire-джобу

Оптимизация фоновых задач

  • AlbumPhotosProcessingJob должна обрабатывать только нераспознанные фото
  • Учитывать наличие тегов/персон и текущую стратегию при выборке фото

Оптимизация Redis/Hangfire

  • Не создавать Hangfire-задачу на каждое фото
  • Обрабатывать фото синхронно при получении события
  • Создавать джобу только при ошибке обработки

Требования к API

  • AdminApi — управление альбомами, стратегиями, отчеты
  • ClientApi — распознавание по селфи
  • InternalApi — межсервисное взаимодействие

Под вопросом. Заменить межсервисные HTTP-вызовы на прямые обращения к БД внутри сервиса.

Требования к наблюдаемости

Healthchecks

Реализовать проверки работоспособности сервиса и зависимостей.

Метрики

Определить, какие метрики нужны, и реализовать их.

Мониторинг

Настроить алерты и дашборды для отслеживания состояния сервиса.

Нефункциональные требования

Масштабируемость

  • Обработка сотен тысяч фото в неделю в сезон
  • Поддержка нескольких инстансов (MSP, Witisi) - позже. Сейчас - свой инстанс для каждого проекта.

Надежность

  • Обработка должна продолжаться при недоступности Redis
  • Повторная обработка при сбоях через механизм подписок

Совместимость

  • Сохранить текущую функциональность
  • Обеспечить миграцию данных из старых сервисов
  • Под вопросом. Обратная совместимость API для клиентов и админки