Esta página aborda a conversão de ficheiros para e a partir de um estado comprimido com gzip. A página inclui uma vista geral da transcodificação, práticas recomendadas para trabalhar com metadados associados e o comportamento dos ficheiros comprimidos no Cloud Storage.
Transcodificação e gzip
O gzip é uma forma de compressão de dados: reduz normalmente o tamanho de um ficheiro. Isto permite que o ficheiro seja transferido mais rapidamente e armazenado com menos espaço do que se não fosse comprimido. A compressão de um ficheiro pode reduzir o custo e o tempo de transferência. A transcodificação, no Cloud Storage, é a alteração automática da compressão de um ficheiro antes de ser disponibilizado a um requerente. Quando a transcodificação resulta num ficheiro comprimido com gzip, pode ser considerada compressiva, enquanto que, quando o resultado é um ficheiro que já não está comprimido com gzip, pode ser considerado descompressivo. O Cloud Storage suporta a forma descompressiva da transcodificação.
O Cloud Storage não suporta a transcodificação descompressiva para objetos comprimidos com Brotli.
Transcodificação descompressiva
A transcodificação descompressiva permite-lhe armazenar versões comprimidas de ficheiros no Cloud Storage, o que reduz os custos de armazenamento em repouso, ao mesmo tempo que continua a disponibilizar o próprio ficheiro ao requerente, sem compressão. Isto é útil, por exemplo, quando publica ficheiros para os clientes.
Para que a transcodificação descompressiva ocorra, um objeto tem de cumprir dois critérios:
O ficheiro é comprimido com gzip quando é armazenado no Cloud Storage.
Os metadados do objeto incluem
Content-Encoding: gzip
.
Quando um objeto cumpre estes dois critérios, é submetido a transcodificação descompressiva quando é publicado, e a resposta que contém o objeto não contém um cabeçalho Content-Encoding
nem Content-Length
.
Existem duas formas de impedir que a transcodificação descompressiva ocorra para um objeto que, de outra forma, seria elegível:
Se o pedido do objeto incluir um cabeçalho
Accept-Encoding: gzip
, o objeto é publicado tal como está nesse pedido específico, juntamente com um cabeçalho de respostaContent-Encoding: gzip
.Se o campo de metadados
Cache-Control
do objeto estiver definido comono-transform
, o objeto é publicado como um objeto comprimido em todos os pedidos subsequentes, independentemente dos cabeçalhos dos pedidosAccept-Encoding
.
A prevenção da transcodificação descompressiva é útil, por exemplo, se quiser reduzir o custo ou o tempo de transferência de dados de saída ou se quiser validar se os objetos transferidos têm as somas de verificação crc32c/md5 esperadas.
Considerações
Tenha em atenção o seguinte quando trabalhar com a transcodificação descompressiva:
A transcodificação descompressiva invalida a verificação de integridade. Se os requerentes dos seus dados confiarem na soma de verificação para a verificação de integridade, não deve usar a transcodificação descompressiva.
A transcodificação descompressiva permite-lhe armazenar objetos no Cloud Storage num estado comprimido, o que poupa espaço e custos. No entanto, as cobranças pela transferência do objeto baseiam-se no respetivo tamanho descomprimido, uma vez que esse é o tamanho do objeto publicado.
Quando acedidos a partir de um contentor montado com FUSE do Cloud Storage, os objetos não são transcodificados com descompressão e são lidos como comprimidos.
Content-Type vs. Content-Encoding
Existem vários comportamentos que deve ter em atenção relativamente à forma como o Content-Type
Content-Encoding
se relaciona com a transcodificação. Ambos são metadados
armazenados juntamente com um objeto. Consulte o artigo Ver e editar metadados de objetos para ver instruções passo a passo sobre como adicionar metadados a objetos.
Content-Type
deve ser incluído em todos os carregamentos e indica o tipo de objeto que está a ser carregado. Por exemplo:
Content-Type: text/plain
indica que o objeto carregado é um ficheiro de texto simples. Embora não exista uma verificação para garantir que o Content-Type
especificado corresponde à verdadeira natureza de um objeto carregado, a especificação incorreta do respetivo tipo, na melhor das hipóteses, faz com que os requerentes recebam algo diferente do que esperavam e pode levar a comportamentos não intencionais.
Content-Encoding
é opcional e, se quiser, pode ser incluído no carregamento de ficheiros comprimidos. Por exemplo:
Content-Encoding: gzip
indica que o objeto carregado está comprimido com gzip. Tal como com Content-Type
, não existe nenhuma verificação para garantir que o Content-Encoding
especificado é efetivamente aplicado ao objeto carregado e a especificação incorreta da codificação de um objeto pode originar um comportamento não intencional em pedidos de transferência subsequentes.
Boas práticas
Quando carregar um objeto comprimido com gzip, a forma recomendada de definir os metadados é especificar
Content-Type
eContent-Encoding
. Por exemplo, para um ficheiro de texto simples comprimido:Content-Type: text/plain Content-Encoding: gzip
Isto dá mais informações sobre o estado do objeto a qualquer pessoa que aceda ao mesmo. Ao fazê-lo, o objeto também fica elegível para transcodificação descompressiva quando for transferido mais tarde, o que permite que as aplicações cliente tratem corretamente a semântica de
Content-Type
.Em alternativa, pode carregar o objeto com o elemento
Content-Type
definido para indicar a compressão e SEMContent-Encoding
. Por exemplo:Content-Type: application/gzip
No entanto, neste caso, a única coisa imediatamente conhecida sobre o objeto é que está comprimido 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 fazê-lo, não deve carregar um ficheiro comprimido com gzip omitindo a natureza comprimida do ficheiro. Por exemplo, para um ficheiro de texto simples comprimido com gzip, deve evitar definir apenas
Content-Type: text/plain
. Ao fazê-lo, representa incorretamente o estado do objeto, uma vez que será entregue a um requerente.Da mesma forma, os objetos não devem ser carregados com um
Content-Type
omitido, mesmo que umContent-Encoding
esteja incluído. Se o fizer, o valor deContent-Type
pode ser definido como um valor predefinido, mas o pedido pode ser rejeitado, dependendo da forma como o carregamento é feito.
Práticas incorretas
Não deve definir os metadados para comunicar de forma redundante a compressão do objeto:
Content-Type: application/gzip Content-Encoding: gzip
Isto implica que está a carregar um objeto comprimido com gzip que foi comprimido com gzip uma segunda vez, quando normalmente não é o caso (se planear efetivamente comprimir um ficheiro duas vezes, consulte a secção Usar gzip em objetos comprimidos abaixo). Quando ocorre a transcodificação descompressiva num objeto comunicado incorretamente, o objeto é publicado com codificação de identidade, mas os requerentes pensam que receberam um objeto que ainda tem uma camada de compressão associada ao mesmo. As tentativas de descompressão do objeto vão falhar.
Da mesma forma, um ficheiro que não esteja comprimido com gzip não deve ser carregado com o elemento
Content-Encoding: gzip
. Ao fazê-lo, o objeto parece ser elegível para transcodificação, mas quando são feitos pedidos para o objeto, as tentativas de transcodificação falham.
Usar gzip em objetos comprimidos
Alguns objetos, como muitos ficheiros de vídeo, áudio e imagem, sem mencionar os próprios ficheiros gzip, já estão comprimidos. A utilização de gzip em tais objetos praticamente não oferece vantagens. Em quase todos os casos, faz com que o objeto seja maior devido à sobrecarga do gzip. Por este motivo, a utilização de gzip em conteúdo comprimido é geralmente desaconselhada e pode causar comportamentos indesejados.
Por exemplo, embora o Cloud Storage permita que os objetos "duplamente comprimidos" (ou seja, objetos comprimidos com gzip, mas que também têm um Content-Type
que está comprimido) sejam carregados e armazenados, não permite que os objetos sejam publicados num estado duplamente comprimido, a menos que os respetivos metadados Cache-Control
incluam no-transform
. Em vez disso, remove o nível de compressão gzip externo, elimina o cabeçalho da resposta Content-Encoding
e publica o objeto resultante. Isto ocorre mesmo para pedidos com Accept-Encoding: gzip
.
Assim, o ficheiro recebido pelo cliente não tem a mesma soma de verificação que o ficheiro carregado e armazenado no Cloud Storage, pelo que todas as verificações de integridade falham.
Usar o cabeçalho Range
Quando ocorre a transcodificação, se o pedido do objeto incluir um cabeçalho Range
, esse cabeçalho é ignorado silenciosamente. Isto significa que os pedidos de conteúdo parcial não são cumpridos e, em vez disso, a resposta publica o objeto pedido completo. Por exemplo, se tiver um objeto de 10 GB elegível para transcodificação, mas incluir o cabeçalho Range: bytes=0-10000
no pedido, continua a receber o objeto completo de 10 GB.
Este comportamento surge porque não é possível selecionar um intervalo de um ficheiro comprimido sem primeiro descomprimir o ficheiro na sua totalidade: cada pedido de parte de um ficheiro seria acompanhado pela descompressão do ficheiro inteiro, potencialmente grande, o que usaria os recursos de forma ineficiente. Deve ter em atenção este comportamento e evitar usar o cabeçalho Range
quando usar a transcodificação, uma vez que são cobradas taxas pela transmissão do objeto completo e não apenas pelo intervalo pedido.
Para mais informações sobre o comportamento de resposta permitido a pedidos com cabeçalhos Range
, consulte a especificação.
Se forem necessários cabeçalhos Range
, deve garantir que não ocorre transcodificação para o objeto pedido. Pode fazê-lo escolhendo as propriedades adequadas quando carregar objetos para começar. Por exemplo, os pedidos de intervalo para objetos com Content-Type: application/gzip
e sem Content-Encoding
são realizados conforme solicitado.
O que se segue
- Saiba mais sobre a flag
--gzip-local
quando usargcloud storage cp
, que aplica a codificação de conteúdos gzip aos carregamentos de ficheiros. - Saiba como ver e editar metadados de objetos.