Распространение Google Cloud Storage

Сколько времени нужно, чтобы изменение файла в Google Cloud Storage распространялось?

У меня очень неприятная проблема, когда я изменяю содержимое файла и повторно загружаю его через gsutil, но изменение не проявляется в течение нескольких часов. Есть ли способ заставить измененный файл распространять все сразу?

Если я смотрю на файл в консоли Google Cloud Storage, он видит новый файл, но затем, если я нажимаю общедоступный URL-адрес, это старая версия, а в некоторых случаях - две версии назад.

Есть ли заголовок, который я не устанавливаю?

РЕДАКТИРОВАТЬ:

Я попробовал gsutil -h "Cache-Control: no-cache" cp -a public-read MyFile, и это не помогло, но, может быть, срок действия старого файла должен истечь, прежде чем новая версия без кеша вступит во владение?

Я сделал завиток -I в файле и получил это обратно:

HTTP/1.1 200 OK
Server: HTTP Upload Server Built on Dec 12 2012 15:53:08 (1355356388)
Expires: Fri, 21 Dec 2012 19:58:39 GMT
Date: Fri, 21 Dec 2012 18:58:39 GMT
Last-Modified: Fri, 21 Dec 2012 18:53:41 GMT
ETag: "66d820174d6de17a278b327e4c3e9b4e"
x-goog-sequence-number: 3
x-goog-generation: 1356116021512000
x-goog-metageneration: 1
Content-Type: application/octet-stream
Content-Language: en
Accept-Ranges: bytes
Content-Length: 160
Cache-Control: public, max-age=3600, no-transform
Age: 3449

Кажется, это означает, что срок его действия истечет через час, несмотря на отсутствие кеша.


person Roger Gilbrat    schedule 21.12.2012    source источник


Ответы (1)


Google Cloud Storage обеспечивает надежную согласованность данных: после завершения записи при чтении из любой точки мира будут получены самые свежие данные.

Однако, если вы включите кэширование (что по умолчанию верно для любого общедоступного объекта), при чтении этого объекта будет видна версия объекта, возраст которой равен максимальному возрасту Cache-Control, указанному для объекта. Если, например, вы загрузили файл так:

gsutil cp -a public-read file gs://my_bucket/file

Вы можете видеть, что максимальный возраст составляет 1 час (3600 секунд):

gsutil ls -L gs://my_bucket/file
gs://my_bucket/file:
    Creation time:  Fri, 21 Dec 2012 19:59:57 GMT
    Cache-Control:  public, max-age=3600, no-transform
    Content-Length: 1065
    Content-Type:   text/plain
    ETag:       eb3fb83beedf1efffe5b8e32e8d6a65a
    ...

Если вы хотите предотвратить кеширование общедоступного объекта, вы можете сделать:

gsutil setmeta -h Cache-Control:no-cache gs://my_bucket/file

В качестве альтернативы вы можете установить более короткий максимальный возраст объекта:

gsutil setmeta -h 'Cache-Control:public, max-age=600, no-transform'

Майк Шварц, команда Google Cloud Storage

person Mike Schwartz    schedule 21.12.2012
comment
Я обновил свои вопросы, добавив, что я пробовал без кеширования, но я все еще вижу max-age = 3600. Должен ли истек срок действия старого файла, прежде чем новый файл без кеширования вступит во владение? - person Roger Gilbrat; 22.12.2012
comment
Хорошо, похоже, что вам нужно подождать, пока истечет срок действия старой кэшированной версии, прежде чем версия без кеша вступит во владение. Теперь, когда срок его действия истек, версия без кеширования отображается правильно. - person Roger Gilbrat; 22.12.2012
comment
@mike, было бы неплохо иметь функцию аннулирования / очистки кеша, как на CDN. - person themihai; 20.12.2013
comment
Экспорт BigQuery в CSV не позволяет устанавливать какой-либо заголовок. Каждый экспорт - person Caio Iglesias; 13.06.2014
comment
@mihai - было бы сложно предоставить функцию аннулирования кеша, потому что после обслуживания с TTL, отличным от 0, любой кеш в Интернете (а не только те, которые находятся под контролем Google) может (согласно спецификации HTTP) кэшировать данные. - person Mike Schwartz; 21.06.2014
comment
привет @MikeSchwartz, спасибо за ответ, но у меня все еще есть проблема: как описано здесь [1], если я загружаю непубличный файл, а затем делюсь публичностью, файл не имеет меты управления кешем. У меня все еще возникает проблема с распространением: если я добавлю случайный? Adfjhdfbsdjh в качестве строки запроса URL, я увижу последнюю версию файла. Без строки запроса я вижу старую версию. Любая идея? [1] cloud.google.com/storage/docs/gsutil / addlhelp / - person aqquadro; 12.06.2015
comment
@aqquadro: отправьте письмо по адресу [email protected] с названием корзины и объекта, с которыми вы столкнулись с этой проблемой (и укажите мое имя), и я посмотрю. - person Mike Schwartz; 13.06.2015
comment
После обсуждения с @aqquadro я понял проблему: cloud.google В .com / storage / docs / gsutil / addlhelp / неверно указано, что загрузка закрытого объекта и последующая установка ACL на общедоступное чтение приведет к появлению некэшируемого объекта. Фактически, спецификация HTTP позволяет кэшировать общедоступные объекты по умолчанию, поэтому для запрета кеширования вам необходимо установить заголовок Cache-Control, например, используя команду: gsutil -h Cache-Control: private cp -a public-read file. png gs: // ваше ведро. (Я также исправлю некорректную документацию.) - person Mike Schwartz; 16.06.2015
comment
Можно ли отключить кеш для всего ведра? - person Pier; 10.06.2016
comment
@Pier - ни в одном запросе. Вам нужно будет сделать что-то вроде: gsutil -m -h Cache-Control: no-cache, no-store, must-revalidate gs: // your-bucket / **, который сделает запрос для каждого объекта в ведре. . - person Mike Schwartz; 11.06.2016
comment
А как насчет непубличных файлов? они кешируются по умолчанию? - person Pier; 15.06.2016
comment
На всякий случай, если кто-то делает копировальную пасту, команда Майка добавить заголовки без кеширования должна быть gsutil -m setmeta -h "Cache-Control:no-cache, no-store, must-revalidate" gs://your-bucket/** - в основном отсутствует setmeta. - person bakavic; 25.06.2016
comment
Не для меня, это не так. Я очищаю кеш в своем браузере, но старый файл все еще там. Он будет изменен через несколько часов, но это действительно раздражает, так как мне нужно изменить URL-адреса на своем веб-сайте, чтобы протестировать дизайн. - person Maciej Krawczyk; 04.02.2017