У меня проблема с Cloud CDN. Я добавил CDN в корзину, подключенную к экземпляру.
Мне нужно получить элемент из CDN, но этот элемент обновляется с моего сервера каждую секунду. Что происходит, когда из браузера я впервые получаю файл, который я могу получить, тогда файл больше никогда не обновляется (файл - m3u8, и я всегда получаю то же самое)
Файл m3u8 обновляется в сегменте, но не в облачном CDN. Как я могу предотвратить кеширование некоторых типов файлов (или всех файлов) внутри моего облачного CDN?
ОБНОВИТЬ:
Честно говоря, проверяя заголовок ответа прямо из корзины, я получаю "cache-control: public, max-age = 3600". Я начинаю думать, что проблема в корзине, как я могу установить max-age на 0/1 для всей корзины ?
P.s. все мои файлы общедоступны, и я читаю это (https://cloud.google.com/storage/docs/gsutil/commands/setmeta):
Примечание. По умолчанию общедоступные объекты обслуживаются с заголовком Cache-Control, позволяющим кэшировать такие объекты в течение 3600 секунд. Дополнительные сведения об этом поведении по умолчанию см. В разделе CACHE-CONTROL метаданных справки gsutil. Если вам нужно убедиться, что обновления становятся видимыми немедленно, вы должны установить заголовок Cache-Control «Cache-Control: private, max-age = 0, no-transform» для таких объектов.
Я просто хочу не запускать такую команду из cron каждую секунду
gsutil setmeta -h "Content-Type:text/html" \
-h "Cache-Control:public, max-age=0, no-transform" gs://bucket/*.html
Нет общих настроек для прямого управления целым ведром? (не для каждого загруженного контента)
ОБНОВИТЬ: Это сервер nginx для потоковой передачи в реальном времени (rtmp).
Получил m3u8 с индексами других m3u8 для каждого качества.
Если я устанавливаю ведро на свой экземпляр GCE (с помощью gcsfuse), 1-й m3u8, который я получаю из корзины из моего браузера, будет оставаться в кэше внутри корзины в течение 1 часа (max-age = 3600) ... из-за кеширования.
Файлы из GCE не обновляются с помощью gsutil: они напрямую записываются в смонтированный сегмент с помощью gcsfuse.
Чтобы сделать эти файлы общедоступными, я сделал сегмент общедоступным -> это, в соответствии с политикой сегмента Google, сделайте их кешируемыми.
Теоретически мне нужно обновлять все мои файлы m3u8 каждые 1 секунду.
Отвечать:
Пожалуйста, предоставьте более подробную информацию о том, какие данные и каким образом вы записываете в корзину -> m3u8
Чего вы хотите достичь, используя Storage bucket -> shared resource для масштабируемой инфраструктуры
Почему вам нужно обновлять элементы каждые 5 секунд -> нужно обновлять m3u8 каждую 1 секунду (для обновления индексов)
Это проблема.
Пожалуйста, посмотрите документацию Cloud Storage FUSE раздел Ключевые отличия от файловой системы POSIX:
Метаданные: Cloud Storage FUSE не передает метаданные вместе с файлом при загрузке в Cloud Storage.. Это означает, что если вы хотите использовать Cloud Storage FUSE в качестве инструмента для загрузки, вы не сможете устанавливать метаданные, такие как тип контента и списки контроля доступа, как при других методах загрузки. Если свойства метаданных имеют решающее значение, рассмотрите возможность использования gsutil, JSON API или Google Cloud Console.
Между тем, как вы можете найти в документация, чтобы изменить политики по умолчанию, вы должны использовать метаданные:
Видеть метаданные справки gsutil для подробностей о как вы можете установить метаданные при загрузке объектов, какие поля метаданных могут быть установлены и значение этих полей, использование настраиваемых метаданных и способ просмотра текущих установленных метаданных.
Из-за использования Cloud Storage FUSE вы не можете устанавливать метаданные при загрузке объектов и, как результат, ваши файлы m3u8, затронутые политикой кеширования по умолчанию:
По умолчанию общедоступные объекты обслуживаются с заголовком Cache-Control, позволяющим кэшировать такие объекты в течение 3600 секунд.
В качестве временного обходного пути вы можете попробовать использовать setmeta
команда для установить метаданные для уже загруженных объектов:
gsutil setmeta -h "Content-Type:text/html" -h "Cache-Control:public, max-age=0, no-transform" gs://bucket/*.html
но это вызывает множество операций и, как следствие, увеличить стоимость использования.
Чтобы решить эту проблему, вам следует изменить архитектуру вашего сервиса. Например, попробуйте использовать Облачное хранилище файлов для хранения файлов m3u8.
Установите заголовок Cache-Control в метаданных объекта GCS (например,) public, max-age=5
Это скажет Cloud CDN кэшировать его в течение 5 секунд, а затем выполнить повторную загрузку из источника (вашего сегмента) по истечении этого времени.
Вы можете сделать это при загрузке / через API, когда вы нажимаете новый объект: https://cloud.google.com/storage/docs/gsutil/addlhelp/WorkingWithObjectMetadata