Cómo CloudFront procesa las solicitudes parciales de un objeto (rango GET) - Amazon CloudFront

Cómo CloudFront procesa las solicitudes parciales de un objeto (rango GET)

Para objetos grandes, es posible que los lectores (navegadores web u otros clientes) realicen varias solicitudes GET y utilicen el encabezado de solicitud Range para descargar el objeto en partes más pequeñas. Estas solicitudes de rangos de bytes, a veces conocidas como solicitudes Range GET, mejoran la eficacia de las descargas parciales y la recuperación de transferencias que hayan fallado parcialmente.

Cuando CloudFront recibe una solicitud Range GET, revisa la caché de la ubicación periférica que recibe la solicitud. Si la caché de dicha ubicación periférica ya contiene todo el objeto o la parte solicitada del objeto, CloudFront envía inmediatamente el rango solicitado desde la caché.

Si la caché no contiene el rango solicitado, CloudFront reenvía la solicitud al origen. (Para optimizar el rendimiento, CloudFront puede solicitar un intervalo superior al solicitado en Range GET.) Lo que ocurre a continuación depende de si el origen admite solicitudes Range GET:

  • Si el origen admite solicitudes Range GET: devuelve el intervalo solicitado. CloudFront sirve el intervalo solicitado y lo almacena en la caché para futuras solicitudes. (Amazon S3 admite solicitudes Range GET, al igual que muchos servidores HTTP).

  • Si el origen no admite solicitudes Range GET: devuelve todo el objeto. CloudFront sirve la solicitud actual enviando todo el objeto almacenándolo también en caché para futuras solicitudes. Después de que CloudFront almacene en caché todo el objeto en una caché perimetral, responde a las nuevas solicitudes Range GET enviando el intervalo solicitado.

En cualquier caso, CloudFront comienza a enviar el intervalo o el objeto solicitado al usuario final en cuanto llega el primer byte del origen.

nota

Si un lector envía una solicitud Range GET y el origen devuelve Transfer-Encoding: chunked, CloudFront devuelve el objeto entero al lector en lugar del intervalo solicitado.

Por lo general, CloudFront sigue la especificación RFC en el encabezado Range. Sin embargo, si sus encabezados Range no cumplen con los siguientes requisitos, CloudFront devuelve el código de estado HTTP 200 con el objeto entero en lugar del código de estado 206 con los intervalos especificados:

  • Los rangos deben publicarse en orden ascendente. Por ejemplo, 100-200,300-400 es válido; 300-400,100-200 no es válido.

  • Los rangos no deben superponerse. Por ejemplo, 100-200,150-250 no es válido.

  • Todas las especificaciones de los rangos deben ser válidas. Por ejemplo, no puede especificar valores negativos como parte de un rango.

Para obtener más información sobre el encabezado de solicitud Range, consulteRange Requests en RFC 7233, o Range en MDN Web Docs.

Uso de solicitudes de rango para almacenar en caché objetos grandes

Cuando el almacenamiento en caché está habilitado, CloudFront no recupera ni almacena en caché un objeto de más de 50 GB. Cuando un origen indica que el objeto es mayor que este tamaño (en el encabezado de respuesta Content-Length), CloudFront cierra la conexión con el origen y devuelve un error al lector. (Con el almacenamiento en caché desactivado, CloudFront puede recuperar un objeto mayor que este tamaño del origen y pasarlo al lector. Sin embargo, CloudFront no almacena en caché el objeto).

Sin embargo, con las solicitudes de rango, puede utilizar CloudFront para almacenar en caché un objeto mayor que el tamaño máximo de archivo almacenable en caché.

ejemplo Ejemplo
  1. Considere un origen con un objeto de 100 GB. Cuando el almacenamiento en caché está habilitado, CloudFront no recupera ni almacena en caché un objeto de este tamaño. Sin embargo, el lector puede enviar varias solicitudes de rango para recuperar este objeto en partes, con cada parte menor que 50 GB.

  2. El lector puede solicitar el objeto en partes de 20 GB mediante el envío de una solicitud con el encabezado Range: bytes=0-21474836480 para recuperar la primera parte, otra solicitud con el encabezado Range: bytes=21474836481-42949672960 para recuperar la siguiente parte, y así sucesivamente.

  3. Cuando el lector ha recibido todas las partes, puede combinarlas para construir el objeto original de 100 GB.

  4. En este caso, CloudFront almacena en caché cada una de las partes de 20 GB del objeto y puede responder a las solicitudes posteriores de la misma parte desde la caché.