【问题标题】:How do I use server-side gzip decompression with Google Cloud Storage's Go API?如何通过 Google Cloud Storage 的 Go API 使用服务器端 gzip 解压缩?
【发布时间】:2021-05-30 07:30:42
【问题描述】:

我在 GCS 中有一个使用 gzip 压缩的文件,元数据 Content-Encoding 设置为 gzip。这允许 HTTP 层设置请求标头Accept-Encoding: gzip,并允许符合标准的 HTTP 客户端自动解压缩。

但是,它也允许客户端请求未压缩的文件(即不指定 Accept-Encoding: gzip)。然后在 Google 这边进行解压,浪费带宽。

在这种情况下,虽然我想浪费带宽。流量是 GCP 区域的本地流量,因此带宽实际上是无限的,而且是免费的。我的 CPU 比较短缺,因为我的 VM 是那些低 CPU 可爆发的 VM 之一,所以我想把解压缩的工作交给 Google。

如果我使用gsutil,它似乎很聪明,而且它是通过网络压缩的。

Go API 默认显示相同的行为。

如果我尝试将 WithHTTPClient 设置为可能取消设置某些标头,我看不到任何请求标头,并且它希望我手动添加 GCS 凭据。

我还尝试将ReadCompressed 设置为truefalse,但没有成功。

我设法让它在 Google 端解压缩的唯一方法是创建一个签名 URL,然后使用 curl 下载它。这样 curl 的输出速率与带宽使用相匹配。在所有其他情况下,网络流量是下载输出的 10%,表明它在传输过程中被压缩。

我如何在 Go API 中说我希望数据未压缩?

我想看到的是 slurm -i eth0 显示的速度与我的 ./gcscat gs://.... | pv > /dev/null 相同,就像我在签名 URL 上使用 curl -s ... | pv > /dev/null 时看到的一样。

【问题讨论】:

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


    【解决方案1】:

    我不知道你在哪里卡住了,但我在我这边测试了这段代码,它工作得很好。如果内容编码未设置为 GZIP,我会得到一个二进制内容。如果设置了,我会得到一个文本内容;

    import (
      "cloud.google.com/go/storage",
      "context",
      "fmt"
      "io/ioutil"
    )
    
    func main() {
        ctx := context.Background()
        client,err :=storage.NewClient(ctx)
        fmt.Println(err)
        bucket := client.Bucket("gib-multiregion-us")
        blob := bucket.Object("gzip.blob.gz")
        reader, err := blob.NewReader(ctx)
        fmt.Println(err)
        defer reader.Close()
        content, err := ioutil.ReadAll(reader)
        fmt.Println(err)
        fmt.Println(string(content))
    }
    

    【讨论】:

    • 但是在服务器上解压了吗?您的代码与我的基本相同。当我做你在这里的事情时,我会看到例如网络上为 20MB/s(见 slurm),当我将其打印到标准输出到 pv 时为 200MB。我使用的方法似乎是正确的,因为我在使用 curl 时看到 200MB 和 200MB,如上所述。
    猜你喜欢
    • 2016-10-28
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多