30

对 Google Cloud Storage 中的文件所做的更改需要多长时间才能传播?

我遇到了这个非常令人沮丧的问题,我更改了文件的内容并通过 gsutil 重新上传它,但更改在几个小时内都没有出现。有没有办法强制更改的文件立即传播所有内容?

如果我在 Google Cloud Storage 控制台中查看该文件,它会看到新文件,但如果我点击公共 URL,它是旧版本,在某些情况下,是 2 个版本之前。

有没有我没有设置的标题?

编辑:

我试过gsutil -h "Cache-Control: no-cache" cp -a public-read MyFile了,它没有帮助,但也许旧文件需要在新的无缓存版本接管之前过期?

我在文件上做了一个 curl -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

尽管没有缓存,但这似乎表明它将在一个小时内到期。

4

1 回答 1

40

谷歌云存储提供强大的数据一致性:一旦写入完成,从世界任何地方读取都将获得最新数据。

但是,如果您启用缓存(对于任何公共可读对象,默认情况下都是如此),读取该对象可以看到与对象上指定的 Cache-Control max-age 一样旧的对象版本。例如,如果您像这样上传文件:

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

您可以看到 max-age 为 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

或者,您可以在对象上设置更短的 max-age:

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

Mike Schwartz,谷歌云存储团队

于 2012-12-21T20:06:26.733 回答