Transcodificación de archivos comprimidos con gzip

En esta página se explica cómo convertir archivos a un estado comprimido con gzip y viceversa. La página incluye una descripción general de la transcodificación, prácticas recomendadas para trabajar con metadatos asociados y el comportamiento de los archivos comprimidos en Cloud Storage.

Transcodificación y gzip

gzip es una forma de compresión de datos que suele reducir el tamaño de un archivo. De esta forma, el archivo se puede transferir más rápido y se almacena ocupando menos espacio que si no estuviera comprimido. Al comprimir un archivo, se pueden reducir tanto el coste como 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 proporcione a un solicitante. Cuando la transcodificación da como resultado un archivo comprimido con gzip, se puede considerar compresiva, mientras que, si el resultado es un archivo que ya no está comprimido con gzip, se puede considerar descompresiva. Cloud Storage admite la forma de descompresión de la transcodificación.

Cloud Storage no admite la transcodificación de descompresión para objetos comprimidos con Brotli.

Transcodificación descompresiva

La transcodificación de descompresión te permite almacenar versiones comprimidas de archivos en Cloud Storage, lo que reduce los costes de almacenamiento en reposo, al tiempo que se sirve el archivo en sí al solicitante sin compresión. Esto es útil, por ejemplo, cuando se sirven archivos a los clientes.

Para que se produzca la transcodificación de descompresión, un objeto debe cumplir dos criterios:

  1. El archivo se comprime con gzip cuando se almacena en Cloud Storage.

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

Cuando un objeto cumple estos dos criterios, se somete a una transcodificación de descompresión cuando se sirve, y la respuesta que contiene el objeto no incluye un encabezado Content-Encoding ni Content-Length.

Hay dos formas de evitar que se produzca la transcodificación de descompresión en un objeto que, de lo contrario, sería apto:

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

  • Si el campo de metadatos Cache-Control del objeto se define como no-transform, el objeto se sirve como un objeto comprimido en todas las solicitudes posteriores, independientemente de los encabezados de solicitud Accept-Encoding.

Evitar la transcodificación de descompresión es útil, por ejemplo, si quieres reducir el coste o el tiempo de transferencia de datos salientes, o si quieres validar que los objetos descargados tienen las sumas de comprobación crc32c o md5 esperadas.

Cuestiones importantes

Cuando trabajes con la transcodificación de descompresión, ten en cuenta lo siguiente:

  • La transcodificación de descompresión invalida la comprobación de integridad. Si los solicitantes de tus datos dependen de la suma de comprobación para verificar la integridad, no debes usar la transcodificación con descompresión.

  • La transcodificación de descompresión te permite almacenar objetos en Cloud Storage en un estado comprimido, lo que ahorra espacio y costes. Sin embargo, los cargos por descargar el objeto se basan en su tamaño descomprimido, ya que es el tamaño del objeto servido.

  • Cuando se accede a los objetos desde un segmento montado con FUSE de Cloud Storage, no se someten a una transcodificación de descompresión y se leen como comprimidos.

Diferencias entre Content-Type y Content-Encoding

Debes tener en cuenta varios comportamientos relacionados con la forma en que Content-Type y Content-Encoding se relacionan con la transcodificación. Ambos son metadatos almacenados junto con un objeto. Consulta Ver y editar metadatos de objetos para obtener instrucciones detalladas sobre cómo añadir metadatos a los objetos.

Content-Type debe incluirse en todas las subidas e indica el tipo de objeto que se está subiendo. Por ejemplo:

Content-Type: text/plain

Indica que el objeto subido es un archivo de texto sin formato. Aunque no hay ninguna comprobación que garantice que el Content-Type especificado coincida con la naturaleza real de un objeto subido, si se especifica su tipo de forma incorrecta, en el mejor de los casos, los solicitantes recibirán algo distinto de lo que esperaban, lo que podría provocar comportamientos no deseados.

Content-Encoding es opcional y, si quieres, puedes incluirlo en la subida de archivos comprimidos. Por ejemplo:

Content-Encoding: gzip

Indica que el objeto subido está comprimido con gzip. Al igual que con Content-Type, no se realiza ninguna comprobación para garantizar que el Content-Encoding especificado se aplique al objeto subido y, si se especifica incorrectamente la codificación de un objeto, se pueden producir comportamientos inesperados en las solicitudes de descarga posteriores.

Buenas prácticas

  • Cuando subas un objeto comprimido con gzip, la forma recomendada de definir los metadatos es especificar tanto Content-Type como Content-Encoding. Por ejemplo, en el caso de un archivo de texto sin formato comprimido:

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

    De esta forma, cualquier persona que acceda al objeto tendrá la mayor cantidad de información posible sobre su estado. De esta forma, el objeto también podrá someterse a una transcodificación de descompresión cuando se descargue más adelante, lo que permitirá que las aplicaciones cliente gestionen la semántica de Content-Type correctamente.

  • También puede subir el objeto con Content-Type definido como para indicar la compresión y SIN Content-Encoding. Por ejemplo:

    Content-Type: application/gzip
    

    Sin embargo, en este caso, lo único que se sabe inmediatamente sobre el objeto es que está comprimido con gzip, sin información sobre el tipo de objeto subyacente. Además, el objeto no es apto para la transcodificación de descompresión.

Prácticas no permitidas

  • Aunque es posible hacerlo, no se debe subir un archivo comprimido con gzip sin indicar que está comprimido. Por ejemplo, en el caso de un archivo de texto sin formato comprimido con gzip, no debes definir solo Content-Type: text/plain. Si lo hace, se representará incorrectamente el estado del objeto cuando se entregue a un solicitante.

  • Del mismo modo, no se deben subir objetos sin el elemento Content-Type, aunque se incluya un elemento Content-Encoding. Si lo haces, es posible que Content-Type se asigne a un valor predeterminado, pero puede que la solicitud se rechace, en función de cómo se haga la subida.

Prácticas incorrectas

  • No debes definir los metadatos para que informen de forma redundante sobre la compresión del objeto:

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

    Esto implica que estás subiendo un objeto comprimido con gzip que se ha comprimido con gzip una segunda vez, cuando no suele ser así (si realmente tienes previsto comprimir un archivo dos veces, consulta la sección Usar gzip en objetos comprimidos más abajo). Cuando se produce una transcodificación de descompresión en un objeto que se ha notificado incorrectamente, el objeto se sirve con codificación de identidad, pero los solicitantes creen que han recibido un objeto que aún tiene una capa de compresión asociada. No se podrá descomprimir el objeto.

  • Del mismo modo, un archivo que no esté comprimido con gzip no debe subirse con Content-Encoding: gzip. De esta forma, el objeto parece que cumple los requisitos para la transcodificación, pero cuando se hacen solicitudes para el objeto, los intentos de transcodificación fallan.

Usar gzip en objetos comprimidos

Algunos objetos, como muchos archivos de vídeo, audio e imagen, por no hablar de los propios archivos gzip, ya están comprimidos. Usar gzip en estos objetos no ofrece prácticamente ninguna ventaja: en casi todos los casos, el objeto es más grande debido a la sobrecarga de gzip. Por este motivo, no se recomienda usar gzip en contenido comprimido y puede provocar comportamientos no deseados.

Por ejemplo, aunque Cloud Storage permite subir y almacenar objetos "doblemente comprimidos" (es decir, objetos que están comprimidos con gzip, pero que también tienen un Content-Type subyacente que está comprimido), no permite que los objetos se sirvan en un estado doblemente comprimido a menos que sus metadatos Cache-Control incluyan no-transform. En su lugar, elimina el nivel de compresión gzip externo, quita el encabezado de respuesta Content-Encoding y sirve el objeto resultante. Esto ocurre incluso en las solicitudes con Accept-Encoding: gzip. Por lo tanto, el archivo que recibe el cliente no tiene la misma suma de comprobación que el archivo que se ha subido y almacenado en Cloud Storage, por lo que se produce un error en cualquier comprobación de integridad.

Usar el encabezado Range

Cuando se produce una transcodificación, si la solicitud del objeto incluye un encabezado Range, se ignora de forma silenciosa. Esto significa que las solicitudes de contenido parcial no se cumplen y, en su lugar, la respuesta sirve todo el objeto solicitado. Por ejemplo, si tienes un objeto de 10 GB que se puede transcodificar, pero incluyes el encabezado Range: bytes=0-10000 en la solicitud, seguirás recibiendo el objeto completo de 10 GB.

Esto ocurre porque no es posible seleccionar un intervalo de un archivo comprimido sin descomprimirlo primero por completo. Cada solicitud de una parte de un archivo iría acompañada de la descompresión de todo el archivo, que podría ser grande, lo que supondría un uso ineficiente de los recursos. Debes tener en cuenta este comportamiento y evitar usar el encabezado Range cuando utilices la transcodificación, ya que se te cobrará por la transmisión del objeto completo y no solo por el intervalo solicitado. Para obtener más información sobre el comportamiento de respuesta permitido a las solicitudes con encabezados Range, consulta la especificación.

Si se necesitan solicitudes con encabezados Range, debe asegurarse de que no se realice la transcodificación del objeto solicitado. Para ello, elige las propiedades adecuadas al subir los objetos. Por ejemplo, las solicitudes de intervalo de objetos con Content-Type: application/gzip y sin Content-Encoding se realizan según lo solicitado.

Siguientes pasos