Выделите владельца метаданных и обработки изображений, храните оригиналы в объектном хранилище, варианты создавайте асинхронно, а выдачу организуйте через CDN или подписанные URL.
Создание отдельного микросервиса для управления изображениями из монолитного приложения
Выделите владельца метаданных и обработки изображений, храните оригиналы в объектном хранилище, варианты создавайте асинхронно, а выдачу организуйте через CDN или подписанные URL.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В рамках большого монолитного проекта (социальная сеть) существует значительный объём графических файлов – аватары, фотографии из альбомов и т.п. Необходимо первым шагом выделить отдельный микросервис, отвечающий за хранение и обработку этих изображений.
Опишите, каким образом следует подойти к выделению сервиса изображений: выбор хранилища, стандартизация размеров изображений, предоставление доступа к файлам по URL и взаимодействие нового сервиса с остальными компонентами системы.
- Хранение – какие типы хранилищ (облачные, файловые, CDN) подходят, как организовать загрузку и репликацию.
- Стандартизация размеров – какие размеры необходимо генерировать автоматически, какие инструменты использовать для ресайза и оптимизации.
- Возврат по ссылке – как формировать публичные/приватные ссылки, как обеспечить кеширование и безопасность доступа.
- Взаимодействие – какие API (REST, gRPC) и события (message bus) нужны для связи микросервиса с другими модулями монолита, как обеспечить согласованность данных и миграцию существующего контента.
Ответ
Выделите владельца метаданных и обработки изображений, храните оригиналы в объектном хранилище, варианты создавайте асинхронно, а выдачу организуйте через CDN или подписанные URL.
Монолит сохраняет image_id, а новый сервис отвечает за загрузку, состояние обработки и доступные варианты. Оригинал хранится отдельно от производных размеров; перечень размеров определяется интерфейсом, а не произвольными параметрами каждого запроса.
Загрузка проходит проверку формата, размера и числа пикселей; затем очередь запускает декодирование, ресайз и удаление нежелательных метаданных. Для публичных файлов подходят версионированные URL с кешированием, для приватных — короткоживущие подписанные ссылки и проверка доступа.
Миграцию проводят постепенно: новые загрузки идут в сервис, старые копируются с проверкой контрольных сумм, чтение временно поддерживает fallback. События готовности и удаления должны быть идемпотентными. CDN ускоряет выдачу, но не заменяет основное хранилище.