Nesta página, você aprenderá sobre a conversão de arquivos para um estado compactado com gzip e a partir dele. A página inclui uma visão geral da transcodificação, práticas recomendadas para trabalhar com metadados associados e comportamento de arquivos compactados no Cloud Storage.
Transcodificação e gzip
O gzip é uma forma de compactação de dados: ele normalmente reduz o tamanho de um arquivo. Assim, o arquivo é transferido mais rapidamente e usa menos espaço de armazenamento do que se não estivesse compactado. A compactação de um arquivo reduz o custo e o tempo de transferência. A transcodificação, no Cloud Storage, é a alteração automática da compactação de um arquivo antes de ele ser disponibilizado ao solicitante. Quando a transcodificação resulta em um arquivo compactado com gzip, ela pode ser considerada compressiva, e quando o resultado é um arquivo que não é mais compactado com gzip, ela pode ser considerada descompressiva. O Cloud Storage aceita a forma descompressiva de transcodificação.
O Cloud Storage não é compatível com a transcodificação descompressiva para objetos compactados com Brotli.
Transcodificação descompressiva
A transcodificação descompressiva permite armazenar versões compactadas de arquivos no Cloud Storage, o que reduz os custos de armazenamento em repouso, enquanto disponibiliza o próprio arquivo para o solicitante, sem compactação. É útil, por exemplo, ao disponibilizar arquivos para clientes.
Para que a transcodificação descompressiva ocorra, um objeto precisa atender a dois critérios:
O arquivo é compactado com gzip quando armazenado no Cloud Storage.
Os metadados do objeto incluem
Content-Encoding: gzip
.
Quando um objeto atende a esses dois critérios, ele passa por uma transcodificação descompressiva
ao ser exibido e a resposta que contém o objeto não contém um
cabeçalho Content-Encoding
ou Content-Length
.
Há duas maneiras de impedir a transcodificação descompressiva em um objeto elegível para ela:
Se a solicitação do objeto incluir um cabeçalho
Accept-Encoding: gzip
, o objeto será exibido como está nessa solicitação específica e com um cabeçalho de respostaContent-Encoding: gzip
.Se o campo de metadados
Cache-Control
(em inglês) do objeto for definido comono-transform
, esse objeto será exibido como um objeto compactado em todas as solicitações subsequentes, independentemente dos cabeçalhos de solicitaçãoAccept-Encoding
.
Impedir a transcodificação descompressiva é útil, por exemplo, se você quiser reduzir o custo ou o tempo da transferência de dados de saída ou se quiser validar que os objetos transferidos por download tenham as somas de verificação crc32c/md5 esperadas.
Considerações
Tenha em mente o seguinte ao trabalhar com a transcodificação descompressiva:
A transcodificação descompressiva invalida a verificação de integridade. Se os solicitantes de seus dados dependem da soma de verificação para a verificação de integridade, você não deve usar a transcodificação descompressiva.
Com a transcodificação descompactadora, você armazena objetos no Cloud Storage em um estado compactado, economizando espaço e custos. No entanto, as cobranças pelo download do objeto são baseadas no tamanho descompactado, porque esse é o tamanho do objeto disponibilizado.
Quando acessados de um bucket montado do Cloud Storage FUSE, os objetos não passam por transcodificação descompressiva e são lidos como compactados.
Content-Type vs. Content-Encoding
Há vários comportamentos de que você precisa estar ciente sobre como o Content-Type
e Content-Encoding
se relacionam com a transcodificação. Ambos são metadados armazenados junto com um objeto. Consulte Como ver e editar metadados de objeto para instruções passo a passo sobre como adicionar metadados a objetos.
Content-Type
precisa ser incluído em todos os uploads e indica
o tipo de objeto que está sendo enviado. Por exemplo:
Content-Type: text/plain
indica que o objeto enviado é um arquivo de texto simples. Mesmo que não haja uma verificação para garantir que o Content-Type
especificado corresponda à verdadeira natureza de um objeto enviado, a especificação incorreta do tipo fará com que os solicitantes recebam algo diferente do que esperavam e pode levar a comportamentos indesejados.
Content-Encoding
é opcional e pode, se você quiser, ser incluído
no upload de arquivos compactados. Por exemplo:
Content-Encoding: gzip
indica que o objeto carregado é compactado com gzip. Assim como no Content-Type
, não há verificação para garantir que o Content-Encoding
especificado seja realmente aplicado ao objeto carregado, e a especificação incorreta da codificação de um objeto pode levar a um comportamento não intencional nas solicitações de download subsequentes.
Práticas recomendadas
Ao fazer upload de um objeto compactado com gzip, a maneira recomendada de definir os metadados é especificar o
Content-Type
e oContent-Encoding
. Por exemplo, para um arquivo de texto simples compactado:Content-Type: text/plain Content-Encoding: gzip
Eles fornecem o máximo de informações sobre o estado do objeto para qualquer pessoa que o acessa. Além disso, tornam o objeto elegível para transcodificação descompressiva quando o download é feito posteriormente, permitindo que os aplicativos clientes manipulem a semântica do
Content-Type
corretamente.Como alternativa, faça upload do objeto com
Content-Type
definido para indicar compactação e o não uso deContent-Encoding
. Por exemplo:Content-Type: application/gzip
No entanto, nesse caso, a única coisa conhecida imediatamente sobre o objeto é que ele é compactado com gzip, sem informações sobre o tipo de objeto subjacente. Além disso, o objeto não é elegível para transcodificação descompressiva.
Práticas não recomendadas
Embora seja possível, não faça upload de um arquivo que é compactado com gzip com a natureza compactada do arquivo omitida. Por exemplo, para um arquivo de texto simples compactado com gzip, evite configurar somente o
Content-Type: text/plain
. Caso contrário, isso vai representar erroneamente o estado do objeto quando for entregue a um solicitante.Da mesma forma, não faça upload dos objetos com um
Content-Type
omitido, mesmo que umContent-Encoding
esteja incluído. Isso pode fazer com queContent-Type
seja definido como um valor padrão, mas pode resultar na rejeição da solicitação, dependendo de como o upload é feito.
Práticas incorretas
Não defina seus metadados para reportar de modo redundante a compactação do objeto:
Content-Type: application/gzip Content-Encoding: gzip
Isto implica que você está fazendo upload de um objeto compactado com gzip que foi compactado uma segunda vez, quando esse normalmente não é o caso. Se você realmente pretende compactar duplamente um arquivo, consulte a seção Como usar o gzip em objetos compactados abaixo. Quando a transcodificação descompressiva ocorre em um objeto relatado incorretamente, o objeto é disponibilizado com codificação de identidade, mas os solicitantes acham que receberam um objeto que ainda tem uma camada de compactação associada a ele. As tentativas de descompactar o objeto não terão êxito.
Da mesma forma, não faça upload de um arquivo que não é compactado com gzip com o
Content-Encoding: gzip
. Isso faz com que o objeto pareça estar qualificado para transcodificação, mas quando as solicitações são feitas para o objeto, as tentativas de transcodificação falham.
Como usar o gzip em objetos compactados
Alguns objetos, como muitos arquivos de vídeo, áudio e imagem, sem mencionar os próprios arquivos gzip, já estão compactados. Usar o gzip em tais objetos não oferece virtualmente nenhum benefício: em quase todos os casos, fazer isso torna o objeto maior devido à sobrecarga do gzip. Por esse motivo, o uso de gzip em conteúdo compactado é geralmente desencorajado e pode causar comportamentos indesejáveis.
Por exemplo, o Cloud Storage permite que objetos "duplamente compactados" (isto é,
objetos que são compactados com gzip, mas também têm um Content-Type
subjacente que é compactado) sejam carregados e armazenados. No entanto, ele não permite que objetos sejam
disponibilizados em estado duplamente compactado, a menos que os metadados de Cache-Control
incluam no-transform
. Em vez disso, ele remove o nível de compactação externo
do gzip, elimina o cabeçalho de resposta Content-Encoding
e disponibiliza o
objeto resultante. Isso ocorre mesmo para solicitações com Accept-Encoding: gzip
.
O arquivo recebido pelo cliente não tem a mesma soma de verificação do que foi enviado e armazenado no Cloud Storage, então qualquer verificação de integridade falhará.
Como usar o cabeçalho Range
Quando ocorre a transcodificação, se a solicitação do objeto incluir um cabeçalho Range
, ele será ignorado silenciosamente. Isso significa que as solicitações de conteúdo parcial não são atendidas e, em vez disso, a resposta disponibiliza todo o objeto solicitado. Por exemplo, se o objeto de 10 GB não estiver qualificado para transcodificação, mas incluir o cabeçalho Range: bytes=0-10000
na solicitação, você ainda receberá o objeto de 10 GB inteiro.
Esse comportamento ocorre porque não é possível selecionar um intervalo de um arquivo compactado sem primeiro descompactar o arquivo inteiro: cada solicitação de parte de um arquivo seria acompanhada pela descompactação de todo o arquivo, potencialmente grande, o que seria uma utilização incorreta dos recursos. Esteja ciente desse comportamento e evite o uso do cabeçalho Range
ao usar a transcodificação, já que há cobranças para a transmissão de todo o objeto e não apenas do intervalo solicitado.
Para mais informações sobre o comportamento de resposta permitido para solicitações com cabeçalhos Range
, veja a especificação (em inglês).
Se as solicitações com cabeçalhos Range
forem necessárias, certifique-se de que a transcodificação não ocorra para o objeto solicitado. Para isso, escolha as propriedades adequadas ao fazer upload de objetos para iniciar. Por exemplo, as solicitações de intervalo para objetos com Content-Type: application/gzip
e sem Content-Encoding
são executadas conforme solicitado.
Próximas etapas
- Saiba mais sobre a sinalização
--gzip-local
ao usargcloud storage cp
, que aplica a codificação de conteúdo gzip aos uploads de arquivos. - Saiba como ver e editar os metadados de objeto.