【问题标题】:Google Cloud Storage propagation谷歌云存储传播
【发布时间】:2012-12-09 09:16:39
【问题描述】:

对 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

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

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage


    【解决方案1】:

    Google Cloud Storage 提供强大的数据一致性:写入完成后,从世界任何地方读取都将获得最新数据。

    但是,如果您启用缓存(对于任何公共可读对象,默认情况下为 true),读取该对象可以看到与对象上指定的 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,Google 云存储团队

    【讨论】:

    • 我更新了我的问题,包括我尝试了无缓存,但我仍然看到 max-age=3600。旧文件是否需要在新的无缓存文件接管之前过期?
    • @mike 如果有一个功能可以像 CDN 一样使缓存失效/刷新缓存。
    • @mihai - 很难提供缓存失效功能,因为一旦使用非 0 缓存 TTL 提供服务,互联网上的任何缓存(不仅仅是受 Google 控制的缓存)都是允许的(根据 HTTP 规范) 来缓存数据。
    • 在与@aqquadro 讨论后,我发现了问题:cloud.google.com/storage/docs/gsutil/addlhelp/… 错误地指出上传非公共对象然后将 ACL 设置为公共读取会导致不可缓存的对象。事实上,HTTP 规范默认允许缓存公共对象,因此要禁止缓存,您需要设置一个 Cache-Control 标头,例如使用以下命令:gsutil -h Cache-Control:private cp -a public-read file。 png gs://你的桶。 (我也会修复不正确的文档。)
    • @Pier - 不在一个请求中。您必须执行以下操作: gsutil -m -h "Cache-Control:no-cache, no-store, must-revalidate" gs://your-bucket/** 这将对中的每个对象发出请求桶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2016-10-12
    • 2016-12-30
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    相关资源
    最近更新 更多