← Справочные архитектуры / reference-architecture / diagrams / storage
Хранение пользовательского контента
Введение
Пользовательский контент (UGC) является неотъемлемой частью современных приложений. Это включает загрузку пользователями фотографий профиля, документов и видео, а также создание ИИ-моделями изображений, сводок или структурированных данных. Поэтому приложениям требуется надёжное, масштабируемое и экономически эффективное решение для хранения такого контента и доступа к нему.
Cloudflare R2 это объектное хранилище, совместимое с S3, без платы за исходящий трафик, что делает его идеальным для загрузки и доставки контента в большом масштабе. В сочетании с Cloudflare Workers и глобальной сети Cloudflare, это обеспечивает быстрые, безопасные и экономичные процессы приёма и управления пользовательским контентом (UGC).
Эта эталонная архитектура рассматривает два распространённых рабочих процесса для пользовательского контента (UGC), оптимизированных с точки зрения производительности, безопасности и стоимости:
- Безопасная загрузка файлов пользователей в R2 через подписанные URL-адреса: Позволяет пользователям эффективно и безопасно загружать файлы (изображения профиля, документы и т. д.) без перегрузки серверных систем.
- Контент, созданный ИИ и хранящийся в R2: Хранение контента, сгенерированного Workers AI или внешними AI-сервисами, обеспечивает постоянную доступность результатов инференса для дальнейшего использования.
Сценарии использования
Сценарий использования 1: безопасная загрузка файлов пользователями в R2 через подписанные URL
Пользовательский контент, как правило, начинается с загрузки файлов: фотографий профиля, резюме, мультимедиа и документов. Приложения должны безопасно проверять и хранить такие загрузки, избегая при этом задержек, высоких затрат и излишней сложности на стороне backend.
В этой архитектуре используется R2 в качестве основного уровня хранения и Worker для контроля доступа к загрузке. Файлы загружаются напрямую из браузера или устройства пользователя в R2 с помощью подписанных URL-адресов, которые генерируются Worker'ом после проверки прав пользователя и намерения загрузки.
Такой подход позволяет не пропускать крупные файлы через бэкенд приложения или Worker, снижая задержку и эксплуатационные расходы и при этом сохраняя строгий контроль над доступом и безопасностью.
А поскольку R2 нативно интегрирован с глобальной сетью Cloudflare, файлы, хранящиеся в R2, доступны с низкой задержкой из любой точки мира, и без платы за исходящий трафик, даже по мере масштабирования вашего приложения.
Как это работает
- Пользователь инициирует загрузку с frontend: Приложение собирает сведения о файле (например, размер, имя) и вызывает бэкенд-API (Cloudflare Worker), чтобы начать процесс загрузки.
- Worker аутентифицирует пользователя и проверяет запрос: Worker проверяет, что пользователь авторизован, имеет права на загрузку файлов и что файл соответствует допустимым ограничениям (например, максимум 10 МБ, разрешённые MIME-типы).
- Worker возвращает подписанный PUT URL для R2: Подписанный URL позволяет фронтенду загружать файлы напрямую в R2 в течение ограниченного времени под определенным ключом или в определенном пространстве имен. Worker при этом не должен обрабатывать большие файлы самостоятельно.
- Фронтенд загружает файл напрямую в R2: Файл передаётся потоком напрямую от клиента к R2.
- (Необязательно) Запуск процессов после загрузки: R2 предлагает уведомления о событиях чтобы отправлять сообщения в очередь при изменении данных в вашем бакете R2, например при новой загрузке. Пример постобработки:
- Сканирование, модерация или преобразование файла.
- Запись метаданных (например,
user_id,file_path,timestamp) в D1, бессерверная база данных SQL от Cloudflare. - Уведомить пользователя или обновить дашборд/UI.
Дополнительные сведения о прямой загрузке данных из клиента в R2 см. в документации по предварительно подписанные URL-адреса.
Сценарий использования 2: контент, сгенерированный ИИ, хранится в R2
Многие современные приложения используют контент, сгенерированный ИИ: описания товаров, изображения профиля, аудиоклипы и многое другое. Когда такой контент создаётся в ответ на действия пользователя или по расписанию, его необходимо сохранять сразу, надёжно и с возможностью масштабирования.
Эта архитектура использует Workers AI для выполнения инференса на периферии, а затем сохраняет сгенерированный результат напрямую в Cloudflare R2, и все это в рамках одного Worker.
Как это работает
- Пользователь инициирует создание контента: Фронтенд отправляет запрос Cloudflare Worker на создание контента с помощью AI-модели (например, «Создать миниатюру для этого товара»).
- Worker вызывает Workers AI: Worker передаёт пользовательский ввод модели, развёрнутой на Workers AI.
- Сгенерированный результат возвращается в Worker: Ответ может представлять собой обычный текст, изображение в Base64, бинарный буфер или иные структурированные данные в зависимости от типа модели.
- Worker напрямую загружает результат в R2: Подписанный URL или загрузка со стороны клиента не нужны. Worker выполняет безопасный, аутентифицированный
PUTзапрос на сохранение результата в указанном бакете. - Worker возвращает frontend успешный статус и метаданные: Клиент получает ссылку на сохранённый файл (например, путь, ключ объекта или, при необходимости, подписанный URL для загрузки).
См. Использование R2 в Workers подробнее о доступе к бакетам R2 через Cloudflare Workers.
Сводка
Сохраняя пользовательский контент в Cloudflare R2, приложения получают следующие преимущества:
- Высокомасштабируемое хранилище
- Быстрый доступ благодаря периферийным вычислениям Cloudflare
- Предсказуемые расходы без платы за исходящий трафик
- Единые рабочие процессы для ИИ и пользовательского контента, повышающие эффективность
Эта архитектура обеспечивает хранение, обработку и доставку контента быстро, безопасно и экономически эффективно.