Требования
Функциональные требования
Обработка фотографий
- Подписываться на событие
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 для клиентов и админки