Habilita la compresión dinámica

La compresión dinámica comprime automáticamente las respuestas que entrega Cloud CDN. El tamaño de los datos enviados a través de la red se reduce entre un 60% y un 85% en los casos comunes.

La reducción del tamaño disminuye el tiempo que lleva descargar el contenido. En el caso de elementos importantes, como hojas de estilo (CSS), secuencias de comandos (JavaScript) y manifiestos de video (HLS/DASH), esto puede reducir la carga de la página y los tiempos de inicio del video.

Puedes obtener más información sobre los beneficios de comprimir respuestas en la guía Fundamentos de la Web.

Puedes habilitar la compresión en un servicio de backend o un bucket de backend.

Ejemplos de casos de uso

La compresión dinámica reduce directamente el tamaño de los datos enviados desde el perímetro de Cloud CDN al cliente. Esto puede hacer directamente lo siguiente:

  • Reducir el tamaño de CSS y JavaScript, lo que ayuda a las páginas web a renderizar más rápido y a reducir el tiempo de First Contentful Paint, una métrica importante de rendimiento web
  • Generar un gran impacto positivo cuando se almacenan en caché respuestas de la API de REST, como las cargas útiles de JSON. Estas cargas útiles se comprimen de forma correcta debido a las claves repetidas, el espacio en blanco y las llaves. El almacenamiento en caché de APIs públicas durante 5 a 10 segundos es un enfoque popular para reducir la carga de origen y, al mismo tiempo, mantener la actualización de los datos

    Incluso sin el almacenamiento en caché, comprimir estas respuestas puede reducir los bytes totales enviados hasta en un 90%.

  • Mejorar la hora de inicio de reproducción de la entrega de video y la latencia de unión para la transmisión en vivo. Las grandes listas de reproducción en vivo (manifiestos) tienen una cantidad significativa de datos repetidos, incluido el prefijo de ruta y host de cada segmento, así como los metadatos de la lista de reproducción de HLS o DASH. Cuanto más rápido cargue la lista de reproducción o se descarguen las actualizaciones de esta, menos tiempo esperará un cliente para analizar y comenzar a descargar los segmentos de video a los que se hace referencia. Las listas de reproducción de HLS y DASH suelen ver una reducción de su tamaño total de más del 90%

Antes de comenzar

Asegúrate de contar con lo siguiente:

  • Un backend configurado y habilitado para Cloud CDN. Si no tienes Cloud CDN configurado actualmente, puedes seguir una de las guías de configuración
  • Tu backend tiene contenido comprimible listo para entregar, como activos web o manifiestos de video entre 1 KiB y 10 MiB (inclusivo)
  • Los clientes no dependen de recuperar contenido parcial a través de solicitudes de rango o con ETags sólidas. Estas no son compatibles con la compresión dinámica
  • Los clientes pueden controlar las respuestas sin encabezados Content-Length. Por ejemplo, los errores de caché que comprime Cloud CDN no cuentan con encabezados Content-Length
  • El rol de administrador del balanceador de cargas de Compute (roles/compute.loadBalancerAdmin) de IAM, que es necesario para realizar cambios en la configuración de backend

Habilita la compresión en un servicio de backend o un bucket de backend

Para habilitar la compresión, sigue estos pasos.

Consola

Agrega un origen nuevo

Para agregar y configurar un origen nuevo, sigue las instrucciones que se indican en Descripción general de la configuración para saber cuál es el tipo de backend adecuado. Cuando crees tu origen, usa la sección Opciones avanzadas para configurar la compresión dinámica tras seleccionar Automático en la lista Modo de compresión.

Edita un origen existente

Para editar un origen de Cloud CDN existente, sigue estos pasos:

  1. En la consola de Google Cloud , ve a la página Orígenes de Cloud CDN.

    Ir a Orígenes

  2. Haz clic en el nombre del origen que deseas editar y, luego, en Editar.

  3. En la sección Conceptos básicos sobre el origen, haz clic en Siguiente.

  4. En la sección Reglas del host y de la ruta de acceso, haz clic en Siguiente.

  5. En la sección Rendimiento de la caché, navega a Opciones avanzadas.

  6. En la lista Modo de compresión, selecciona Automático.

  7. Para aplicar los cambios, haz clic en Listo.

gcloud

Para los servicios de backend, usa el comando gcloud compute backend-services create o gcloud compute backend-services update con la marca --compression-mode.

Para los buckets de backend, usa el comando gcloud compute backend-buckets create o gcloud compute backend-buckets update con la marca --compression-mode.

Para un servicio de backend nuevo, usa el comando create:

gcloud compute backend-services create BACKEND_SERVICE_NAME \
    --compression-mode=AUTOMATIC

Para un servicio de backend existente, usa el comando update:

gcloud compute backend-services update BACKEND_SERVICE_NAME \
    --compression-mode=AUTOMATIC

Para un bucket de backend nuevo, usa el comando create:

gcloud compute backend-buckets create BACKEND_BUCKET_NAME
    --compression-mode=AUTOMATIC

Para un bucket de backend existente, usa el comando update:

gcloud compute backend-buckets update BACKEND_BUCKET_NAME
    --compression-mode=AUTOMATIC

El compression-mode puede ser uno de los siguientes:

  • AUTOMATIC: Usa de forma automática la mejor compresión en función del encabezado Accept-Encoding que envía el cliente. En la mayoría de los casos, esto hace que se favorezca la compresión de Brotli.
  • DISABLED (predeterminado): Inhabilita la compresión.

API

Para los servicios de backend, usa el método backendServices.insert o backendServices.update.

Para los buckets de backend, usa el método backendBuckets.insert o backendBuckets.update.

Usa uno de los siguientes comandos:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets
PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendBuckets/BACKEND_BUCKET

Agrega el siguiente fragmento al cuerpo de la solicitud JSON:

"compressionMode": AUTOMATIC

El compression-mode puede ser uno de los siguientes:

  • AUTOMATIC (recomendado): Usa de forma automática la mejor compresión en función del encabezado Accept-Encoding que envía el cliente. En la mayoría de los casos, esto hace que se favorezca la compresión de Brotli.
  • DISABLED (predeterminado): Inhabilita la compresión.

En pocos minutos, tu configuración se propaga a todas las ubicaciones perimetrales. El contenido comprimible que se entrega desde el backend se comprime antes de entregarlo al cliente.

Modos de compresión

El modo de compresión predeterminado es DISABLED.

El modo AUTOMATIC permite que Cloud CDN elija el mejor método de compresión en función de los siguientes factores:

  • La codificación aceptada del cliente
  • El índice de compresión previsto de la respuesta
  • La velocidad de compresión (capacidad de procesamiento) de Cloud CDN

En comparación con gzip, Brotli puede producir una reducción adicional del 10% al 20% en el tamaño de la descarga para la mayoría de los tipos de contenido, con un rendimiento de descompresión similar, lo que lo hace más rápido en general cuando se considera el tiempo de descarga y descompresión en el cliente.

Cloud CDN indica el método de compresión elegido como gzip o brotli en el encabezado Content-Encoding de la respuesta.

Cloud CDN determina el nivel de compresión para equilibrar el tamaño total de la descarga y el costo de CPU del cliente. Los niveles de compresión más altos no siempre benefician el rendimiento, en especial, en dispositivos móviles de menor potencia.

Cuando Cloud CDN comprime el contenido inicialmente, quita el encabezado Content-Length de la respuesta. Esto es necesario para permitir que la respuesta se entregue lo más rápido posible, ya que la longitud completa del contenido se desconoce hasta que se comprime toda la respuesta. Después de que se comprime y almacena en caché una respuesta, Cloud CDN puede incluir el encabezado Content-Length en respuestas posteriores. (Para HTTP/1.1 y versiones anteriores, Cloud CDN usa Transfer-Encoding: chunked en la respuesta cuando no usa Content-Length).

¿Cuándo se comprime una respuesta?

Si una solicitud tiene un encabezado Accept-Encoding que enumera explícitamente la compatibilidad con los algoritmos gzip o Brotli, las respuestas sin comprimir que se entregan desde el backend (origen) con un encabezado Content-Type que coincide con los tipos de contenido comprimibles se comprimen con gzip o Brotli, según corresponda. Si una solicitud no tiene un encabezado Accept-Encoding o si tiene Accept-Encoding: *, la respuesta no se comprime.

Por ejemplo, con un encabezado Accept-Encoding en una solicitud del cliente, la respuesta se comprime (o no) de acuerdo con la información de la siguiente tabla:

Encabezado de la solicitud Accept-Encoding Codificación de respuestas
gzip, compress, br Brotli (br)
deflate Sin comprimir
deflate, gzip gzip
identity Sin comprimir
* Sin comprimir

Tipos de contenido que se pueden comprimir

La compresión dinámica se aplica a los siguientes tipos de MIME, en función del encabezado de respuesta HTTP Content-Type. Las respuestas que no tienen un encabezado de respuesta Content-Type no están comprimidas.

Los tipos de contenido comunes y sus tipos de MIME incluyen lo siguiente:

  • Contenido HTML: text/html
  • Hojas de estilo: text/css
  • JavaScript: application/javascript
  • JSON: application/json
  • Listas de reproducción de HLS: application/x-mpegURL o application/vnd.apple.mpegURL
  • Manifiestos de DASH: application/dash+xml

La siguiente tabla resume cómo el tipo de MIME afecta la capacidad de compresión.

  Tipos de MIME que se pueden comprimir
Concordancia exacta application/x-javascript
application/x-sdch-dictionary
application/javascript
application/xml
application/csv
application/json
application/json+protobuf
application/signed-exchange
application/vnd.apple.mpegurl
application/wasm
application/x-plist
application/x-protobuffer
application/x-protobuf
application/x-nacl
application/x-pnacl
font/ttf
font/otf
font/eot
image/svg+xml
image/pwg-raster
image/x-icon
image/vnd.microsoft.icon
video/vnd.mpeg.dash.mpd
audio/mpegURL
application/dash+xml
application/vnd.ms-sstr+xml
Coincidencia del patrón application/*+json
application/*+xml
application/*mpegURL
text/*

Los formatos de imagen y video (como image/jpeg, image/png y video/mpeg4) casi siempre están comprimidos, por lo que Cloud CDN no los comprime. Volver a comprimir una respuesta ya comprimida rara vez reduce el tamaño del archivo, y los clientes pueden presentar un comportamiento inesperado cuando reciben una respuesta de este tipo.

¿Cuándo no se comprime una respuesta?

La compresión dinámica no comprime una respuesta que tiene una o más de las siguientes características:

  • La respuesta no tiene un encabezado Content-Type que coincida con un tipo de contenido comprimible.
  • No tiene un encabezado Content-Length.
  • Tiene un encabezado Content-Encoding.
  • Pesa menos de 1 KiB.

    El tiempo dedicado a comprimir y descomprimir, a menudo, compensa cualquier beneficio. También hay menos contenido para comprimir, lo que puede reducir la eficacia de la compresión y producir una proporción de compresión más baja.

  • Pesa más de 10 MiB.

  • Tiene un encabezado Cache-Control: no-transform.

  • Tiene un encabezado Vary: Accept-Encoding.

Solicitudes de rango

Cuando Cloud CDN comprime una respuesta, agrega un encabezado Accept-Ranges: none y reemplaza los encabezados Accept-Ranges existentes. Los aciertos de caché para esas respuestas ignoran los encabezados Range.

Esto evita que los clientes reciban contenido parcial incorrecto, ya que no hay forma de garantizar si un cliente espera un rango de bytes de la forma comprimida o sin comprimir de un recurso.

ETags

Cuando la compresión dinámica comprime una respuesta, cualquier encabezado ETag fuerte se debilita, como lo requiere el artículo 2.3 de RFC 7232. Por ejemplo, ETag: "xyzzy" se reemplaza por ETag: W/"xyzzy".

Encabezado Vary

Cuando se entrega una respuesta que se puede comprimir (según la solicitud), Cloud CDN agrega el encabezado Vary: Accept-Encoding a la respuesta.

Resumen de los cambios en la respuesta

En la siguiente tabla, se resumen los cambios que Cloud CDN realiza en los encabezados de una respuesta cuando se produce la compresión:

Encabezado de respuesta Valor del encabezado después de la compresión
Content-Encoding Se establece en gzip o brotli.
ETag Cualquier etiqueta de entidad sólida se reemplaza por una versión debilitada, indicada por el prefijo W/.
Accept-Ranges Se establece en el valor none.
Content-Length Es posible que se quite por completo o, si está presente, se establezca en la longitud del contenido del cuerpo comprimido.
Transfer-Encoding En el caso de HTTP/1.1 y protocolos anteriores, si Cloud CDN quita Content-Length, agrega este encabezado con el valor establecido a chunked y fragmenta el cuerpo de la respuesta.

Registros

Los registros de Cloud CDN incluyen un campo compressionStatus en jsonPayload que indica si el balanceador de cargas comprimió la respuesta, junto con el tipo de compresión.

{
  insertId: "1c02hw9g3gjay67"
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
    statusDetails: "response_sent_by_backend"
    cacheId: "IAD-862d661f"
    compressionStatus: "br"
  }
}

Facturación

Cuando se comprime una respuesta a través de Cloud CDN o Cloud Load Balancing, la transferencia de datos salientes relevante, ya sea desde la caché o hacia Internet, respectivamente, se mide en función de la cantidad final de bytes comprimidos enviados al cliente.

Si estás entregando una gran cantidad de respuestas comprimibles, esto puede reducir tus comisiones mensuales por transferencia de datos salientes y también mejorar el rendimiento para los usuarios finales.

Métricas

Cuando la compresión está habilitada, la métrica https/response_bytes_count existente en loadbalancing.googleapis.com informa el tamaño de la respuesta comprimida.

Deberías esperar una disminución en los bytes totales de respuesta (y la capacidad de procesamiento de la transferencia de datos salientes).

Si entregas una gran cantidad de contenido basado en texto que se comprime bien, como HTML, CSS, JavaScript o JSON, es posible que veas una gran disminución de los bytes de respuesta.

Para obtener más información, consulta Supervisión.

¿Qué sigue?