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çõesRange 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çõesRange 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
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
-
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.
-
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çalhoRange: bytes=21474836481-42949672960
para recuperar a próxima parte, e assim por diante. -
Quando o visualizador tiver recebido todas as partes, ele pode combiná-las para construir o objeto original de 100 GB.
-
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.