Transcodifica archivos comprimidos en gzip

En esta página, se trata la conversión de archivos hacia y desde el estado comprimido en gzip. En esta página, se incluyen una descripción general de transcodificación, recomendaciones para trabajar con metadatos asociados y el comportamiento de archivos comprimidos en Cloud Storage.

Transcodificación y gzip

gzip es una forma de compresión de datos: reduce el tamaño de un archivo de forma típica. Esto permite que el archivo se pueda transferir más rápido y se pueda almacenar con menos uso de espacio que si no estuviera comprimido. Comprimir un archivo puede reducir costos y el tiempo de transferencia. La transcodificación, en Cloud Storage, es el cambio automático de la compresión de un archivo antes de que se entregue a un solicitante. Cuando la transcodificación da como resultado un archivo comprimido en gzip, se puede considerar compresiva, mientras que si el resultado es un archivo que ya no está comprimido en gzip, se la puede considerar descompresiva. Cloud Storage es compatible con la forma descompresiva de la transcodificación.

Cloud Storage no es compatible con la transcodificación descompresiva para objetos comprimidos por Brotli.

Transcodificación descompresiva

La transcodificación descompresiva te permite almacenar versiones comprimidas de archivos en Cloud Storage, lo que reduce los costos de almacenamiento en reposo, sin dejar de entregar el archivo al solicitante, sin compresión. Esto es útil, por ejemplo, cuando se entregan archivos a los clientes.

Para que se produzca una transcodificación descompresiva, un objeto debe cumplir con dos criterios:

  1. El archivo está comprimido en gzip cuando se almacena en Cloud Storage.

  2. Los metadatos del objeto incluyen Content-Encoding: gzip.

Cuando un objeto cumple con estos dos criterios, se somete a una transcodificación descompresiva cuando se entrega y la respuesta que contiene el objeto no contendrá un encabezado Content-Encoding o Content-Length.

Hay dos maneras de evitar que la transcodificación descompresiva se produzca en un objeto que de otra forma se considera apto:

  • Si la solicitud del objeto incluye un encabezado Accept-Encoding: gzip, el objeto se entrega como aparece en esa solicitud específica, junto con un encabezado de respuesta Content-Encoding: gzip.

  • Si el campo de metadatos Cache-Control del objeto está establecido en no-transform, se entrega como un objeto comprimido en todas las solicitudes posteriores, sin importar si hay encabezados de solicitud Accept-Encoding.

Evitar la transcodificación descompresiva es útil, por ejemplo, si deseas reducir el costo o el tiempo de transferencia de datos salientes, o si deseas validar los objetos descargados con las sumas de comprobación crc32c/md5 esperadas.

Consideraciones

Ten en cuenta lo siguiente cuando trabajes con transcodificación descompresiva:

  • La transcodificación descompresiva invalida la verificación de integridad en los datos que se muestran en la respuesta. Esto se debe a que el hash almacenado con un objeto representa los datos en su estado comprimido, mientras que los datos entregados tienen quitada la compresión y, en consecuencia, un valor de hash diferente. Si los solicitantes de tus datos dependen de la suma de verificación para la verificación de integridad, no debes usar la transcodificación descompresiva.

  • La transcodificación descompresiva te permite almacenar objetos en Cloud Storage en estado comprimido, lo que ahorra espacio y costos. Sin embargo, los cargos por descargar el objeto se basan en su tamaño descomprimido, porque ese es el tamaño del objeto entregado.

  • Cuando se accede desde un bucket activado por Cloud Storage FUSE, los objetos no se someten a una transcodificación descompresiva y se leen como comprimidos.

Tipo del contenido en comparación a la codificación del contenido

Hay varios comportamientos que debes tener en cuenta acerca de la relación de Content-Type y Content-Encoding con la transcodificación. Ambos son metadatos almacenados junto con un objeto. Consulta Visualiza y edita los metadatos de objetos a fin de obtener instrucciones detalladas para agregar metadatos a objetos.

Content-Type indica el tipo de objeto que se sube y debe incluirse en todas las cargas. Por ejemplo:

Content-Type: text/plain

indica que el objeto subido es un archivo de texto sin formato. Aunque no hay ninguna verificación para garantizar que el Content-Type especificado coincida con la verdadera naturaleza de un objeto subido, la especificación incorrecta de su tipo en el mejor de los casos hará que los solicitantes reciban algo diferente de lo que esperaban y podría conducir a comportamientos no deseados.

Content-Encoding es opcional y, si lo deseas, puede incluirse en la carga de archivos comprimidos. Por ejemplo:

Content-Encoding: gzip

indica que el objeto subido está comprimido en gzip. Al igual que con Content-Type, no hay ninguna verificación para garantizar que el Content-Encoding especificado se aplique en realidad al objeto subido, y la especificación incorrecta de la codificación de un objeto podría conducir a un comportamiento no deseado en las solicitudes de descarga posteriores.

Recomendaciones

  • Cuando se sube un objeto comprimido en gzip, la forma recomendada de configurar tus metadatos es especificar Content-Type y Content-Encoding. Por ejemplo, para un archivo de texto sin formato comprimido, esta sería la forma recomendada:

    Content-Type: text/plain
    Content-Encoding: gzip
    

    Esto brinda la mayor cantidad de información sobre el estado del objeto a cualquiera que acceda a él. Esto también hace que el objeto sea elegible para la transcodificación descompresiva cuando se descargue más tarde, lo que permite que las aplicaciones cliente manejen la semántica de Content-Type de forma correcta.

  • Como alternativa, puedes subir el objeto con Content-Type establecido para indicar compresión y sin NINGÚN Content-Encoding. Por ejemplo:

    Content-Type: application/gzip
    

    De todas formas, en este caso lo único que se sabe de inmediato sobre el objeto es que está comprimido en gzip, sin información sobre el tipo de objeto subyacente. Además, el objeto no es elegible para la transcodificación descompresiva.

Prácticas no recomendadas

  • A pesar de que es posible hacerlo, no se debe subir un archivo comprimido en gzip sin indicar la naturaleza comprimida del archivo. Por ejemplo, para un archivo de texto sin formato comprimido en gzip, debes evitar configurar solo Content-Type: text/plain. Hacer eso tergiversa el estado del objeto que se entregará a un solicitante.

  • Del mismo modo, los objetos no deben subirse con un Content-Type omitido, incluso si se incluye un Content-Encoding. Si lo haces, es posible que Content-Type se establezca en un valor predeterminado, pero que se rechace la solicitud, según cómo se realice la carga.

Prácticas incorrectas

  • No debes configurar tus metadatos para que informen de forma redundante la compresión del objeto:

    Content-Type: application/gzip
    Content-Encoding: gzip
    

    Esto implica que lo que subes es un objeto comprimido en gzip que se volvió a comprimir en gzip una segunda vez, aunque ese no es el caso típico (si en realidad quieres comprimir un archivo dos veces, consulta la sección sobre el uso de gzip en objetos comprimidos a continuación). Cuando la transcodificación descompresiva se realiza sobre un objeto informado de forma incorrecta, este se entrega con la identidad codificada, pero los solicitantes creerán que recibieron un objeto que aún tiene una capa de compresión asociada. Los intentos de descomprimir el objeto fallarán.

  • Del mismo modo, un archivo que no esté comprimido en gzip no debe subirse con Content-Encoding: gzip. Si haces eso, el objeto parecerá elegible para la transcodificación, pero, cuando se lo solicite, los intentos de transcodificación fallarán.

Usa gzip en objetos comprimidos

Algunos objetos, como muchos archivos de imagen, video y audio, sin mencionar a los archivos gzip en sí, ya se encuentran comprimidos. Usar gzip en esos objetos ofrece casi ningún beneficio: en la mayoría de los casos, hacerlo agranda el objeto debido a la sobrecarga de gzip. Por este motivo, no se suele recomendar que uses gzip en contenido comprimido, ya que, además, podría causar comportamientos no deseados.

Por ejemplo, aunque Cloud Storage permite que se suban y almacenen objetos “con doble compresión” (es decir, objetos que están comprimidos en gzip, pero también tienen un tipo de contenido subyacente Content-Type comprimido), no permite que se entreguen objetos en un estado con doble compresión, a menos que sus metadatos Cache-Control incluyan no-transform. En su lugar, quita el nivel de compresión externo, gzip, descarta el encabezado de respuesta Content-Encoding y entrega el objeto resultante. Esto ocurre incluso para solicitudes con Accept-Encoding: gzip. Por lo tanto, el archivo que recibe el cliente no tiene la misma suma de verificación que lo que se subió y almacenó en Cloud Storage, por lo que cualquier verificación de integridad falla.

Usa el encabezado Range

Cuando se realiza la transcodificación, si la solicitud del objeto incluye un encabezado Range, este se ignora de forma silenciosa. Esto significa que las solicitudes de contenido parcial no se llevan a cabo y la respuesta, en su lugar, entrega el objeto solicitado completo. Por ejemplo, si tienes un objeto de 10 GB elegible para la transcodificación, pero incluyes el encabezado Range: bytes=0-10000 en la solicitud, recibirás el objeto de 10 GB completo.

Este comportamiento surge porque no es posible seleccionar un rango desde un archivo comprimido sin descomprimir el archivo primero en su totalidad: cada solicitud de una parte del archivo estaría acompañada de la descompresión completa de un archivo potencialmente grande, que usaría recursos de modo deficiente. Debes tener en cuenta este comportamiento y evitar usar el encabezado Range cuando uses la transcodificación, ya que se generan cargos por la transmisión de todo el objeto, no solo del rango solicitado. Si deseas obtener más información sobre el comportamiento de respuesta permitido para las solicitudes con encabezados Range, consulta la especificación.

Si se necesitan solicitudes con encabezados Range, debes asegurarte de que no se realice la transcodificación para el objeto solicitado. Para lograr esto, selecciona las propiedades adecuadas cuando subas objetos. Por ejemplo, las solicitudes de rango para objetos con Content-Type: application/gzip y sin Content-Encoding se realizan según lo solicitado.

Pasos siguientes