Как и где хранили изображения в вашем последнем проекте?

«Как и где хранили изображения в вашем последнем проекте?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Изображения хранились в Amazon S3 (Simple Storage Service) с использованием Amazon CloudFront в качестве CDN для быстрой глобальной доставки.

Архитектура хранения:

  1. Исходные файлы загружались в S3-бакет с уникальными ключами (например, users/{userId}/avatar/{timestamp}.jpg).
  2. CloudFront распределял контент по edge-локациям, уменьшая задержку.
  3. Для безопасного доступа генерировались подписанные URL (Signed URLs) с ограниченным временем действия (TTL).

Преимущества такого подхода:

  • Масштабируемость: S3 автоматически масштабируется под нагрузку.
  • Долговечность: Высокая доступность (99.99%) и резервирование данных.
  • Интеграция: Прямая совместимость с другими AWS-сервисами (Lambda, Rekognition).
  • Экономия: Оплата только за фактически использованный объем хранилища и трафик.

Пример кода загрузки (Java SDK v2):

S3Client s3Client = S3Client.builder()
        .region(Region.EU_WEST_1)
        .build();

PutObjectRequest request = PutObjectRequest.builder()
        .bucket("my-app-images")
        .key("uploads/2023/profile_123.jpg")
        .contentType("image/jpeg")
        .build();

s3Client.putObject(request, RequestBody.fromFile(new File("/local/path/image.jpg")));

Безопасность: Доступ к бакету был ограничен политиками IAM, а публичный доступ отключен. Все запросы из приложения использовали временные подписанные URL от CloudFront.