Como o CloudFront processa solicitações parciais de um objeto (Range GETs) - Amazon CloudFront

Como o CloudFront processa solicitações parciais de um objeto (Range GETs)

Para um objeto grande, o visualizador (navegador ou outro cliente) pode fazer várias solicitações GET e usar o cabeçalho de solicitação Range para baixar o objeto em partes menores. Essas solicitações de intervalos de bytes, também conhecidas como solicitações Range GET, melhoram a eficiência de downloads parciais e a recuperação de transferências parciais com falha.

Ao receber uma solicitação Range GET, o CloudFront verifica o cache no local de borda que recebeu a solicitação. Se o cache desse ponto de presença já contiver todo o objeto ou a parte solicitada dele, o CloudFront fornecerá imediatamente o intervalo solicitado do cache.

Se o cache não contiver o intervalo solicitado, o CloudFront encaminhará a solicitação à origem. (Para otimizar a performance, o CloudFront pode solicitar um intervalo maior que o solicitado pelo cliente em Range GET.) O que acontece em seguida depende se a origem é compatível ou não com solicitações Range GET:

  • Se a origem for compatível com solicitações Range GET: ele exibirá o intervalo solicitado. O CloudFront fornece o intervalo solicitado e o armazena em cache para futuras solicitações. (O Amazon S3 oferece suporte a solicitações Range GET, assim como muitos servidores HTTP.)

  • Se a origem não for compatível com solicitações Range GET: ele exibirá todo o objeto. O CloudFront atende à solicitação atual enviando o objeto inteiro enquanto também o armazena em cache para solicitações futuras. Depois de armazenar o objeto inteiro em cache em um cache de ponto de presença, o CloudFront responde a novas solicitações Range GET fornecendo o intervalo solicitado.

Nos dois casos, o CloudFront começa a fornecer o intervalo ou o objeto solicitado ao usuário final assim que o primeiro byte chega da origem.

nota

Se o visualizador fizer uma solicitação Range GET e a origem retornar Transfer-Encoding: chunked, o CloudFront retornará o objeto inteiro ao visualizador, em vez do intervalo solicitado.

Normalmente, o CloudFront segue a especificação RFC do cabeçalho Range. No entanto, se os cabeçalhos Range não seguirem os seguintes requisitos, o CloudFront retornará o código de status 200 com todo o objeto, em vez do código de status 206 com os intervalos especificados:

  • Os intervalos devem estar indicados em ordem crescente. Por exemplo, 100-200,300-400 é válido; 300-400,100-200 não é válido.

  • Os intervalos não devem se sobrepor. Por exemplo, 100-200,150-250 não é válido.

  • Todas as especificações dos intervalos devem ser válidas. Por exemplo, você não pode especificar um valor negativo como parte de um intervalo.

Para obter mais informações sobre o cabeçalho de solicitação Range, consulte Solicitações de intervalo na RFC 7233, ou Intervalo no MDN Web Docs.

Usar solicitações de intervalo para armazenar objetos grandes em cache

Quando o armazenamento em cache está ativado, o CloudFront não recupera nem armazena em cache um objeto maior que 50 GB. Quando uma origem indica que o objeto é maior que isso (no cabeçalho de resposta Content-Length), o CloudFront fecha a conexão com a origem e exibe um erro ao visualizador. (Com o armazenamento em cache desativado, o CloudFront pode recuperar um objeto maior que isso da origem e passá-lo para o visualizador. No entanto, o CloudFront não armazena o objeto em cache.)

No entanto, com solicitações de intervalo, é possível usar o CloudFront para armazenar em cache um objeto maior que o tamanho máximo de arquivo armazenável em cache.

exemplo Exemplo
  1. Pense em uma origem com um objeto de 100 GB. Com o armazenamento em cache habilitado, o CloudFront não recupera nem armazena em cache um objeto desse tamanho. No entanto, o visualizador pode enviar várias solicitações de intervalo para recuperar esse objeto em partes, sendo cada uma menor que 50 GB.

  2. O visualizador pode solicitar o objeto em partes de 20 GB enviando uma solicitação com o cabeçalho Range: bytes=0-21474836480 para recuperar a primeira parte, outra solicitação com o cabeçalho Range: bytes=21474836481-42949672960 para recuperar a próxima parte, e assim por diante.

  3. Quando o visualizador tiver recebido todas as partes, ele pode combiná-las para construir o objeto original de 100 GB.

  4. Nesse caso, o CloudFront armazena em cache cada uma das partes de 20 GB do objeto e pode responder a solicitações subsequentes para a mesma parte do cache.