Comment CloudFront traite les demandes partielles pour un objet (plage GETS) - Amazon CloudFront

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Comment CloudFront traite les demandes partielles pour un objet (plage GETS)

Pour un objet large, l’utilisateur (navigateur web ou autre client) peut effectuer plusieurs demandes GET et utiliser l’en-tête de demande Range pour télécharger l’objet en parties plus petites. Ces demandes de plages d’octets, parfois appelées demandes Range GET, améliore l’efficacité des téléchargements partiels et la récupération de transferts ayant partiellement échoué.

Lorsqu'il CloudFront reçoit une Range GET demande, il vérifie le cache à l'emplacement périphérique qui a reçu la demande. Si le cache situé à cet emplacement périphérique contient déjà l'objet entier ou la partie demandée de l'objet, CloudFront diffuse immédiatement la plage demandée depuis le cache.

Si le cache ne contient pas la plage demandée, CloudFront transmet la demande à l'origine. (Pour optimiser les performances, vous CloudFront pouvez demander une plage plus large que celle demandée par le client dans leRange GET.) Ce qui se produit dépend de si l’origine prend en charge les demandes Range GET :

  • Si l'origine prend en charge les Range GET demandes : elle renvoie la plage demandée. CloudFront sert la plage demandée et la met également en cache pour les demandes futures. (Amazon S3 prend en charge les demandes Range GET, tout comme de nombreux serveurs HTTP.)

  • Si l'origine ne prend pas en charge les Range GET demandes : elle renvoie l'objet entier. CloudFront répond à la demande en cours en envoyant l'objet entier tout en le mettant en cache pour les demandes futures. Après avoir mis en CloudFront cache l'objet entier dans un cache périphérique, il répond aux nouvelles Range GET demandes en fournissant la plage demandée.

Dans les deux cas, CloudFront commence à servir la plage ou l'objet demandé à l'utilisateur final dès que le premier octet arrive depuis l'origine.

Note

Si le visualiseur fait une Range GET demande et que l'origine revientTransfer-Encoding: chunked, CloudFront renvoie l'objet entier au visualiseur au lieu de la plage demandée.

CloudFront suit généralement la spécification RFC pour l'Rangeen-tête. Cependant si vos en-têtes Range ne respectent pas les exigences suivantes, CloudFront renvoie un code de statut HTTP 200 avec l'objet entier au lieu du code de statut 206 avec les plages spécifiées :

  • Les plages doivent être répertoriées en ordre croissant. Par exemple, 100-200,300-400 est valide, mais pas 300-400,100-200.

  • Les plages ne doivent pas se chevaucher. Par exemple, 100-200,150-250 n’est pas valide.

  • Toutes les spécifications de plages doivent être valides. Par exemple, vous ne pouvez pas spécifier une valeur négative dans une plage.

Pour plus d’informations sur l’en-tête de demande Range, consultez la section Demandes de plage dans RFC 7233, ou Plage dans MDN Web Docs.

Utiliser les demandes de plage pour mettre en cache de large objets

Lorsque la mise en cache est activée, CloudFront elle ne récupère ni ne met en cache un objet de plus de 50 Go. Lorsqu'une origine indique que l'objet est plus grand que cette taille (dans l'en-tête de Content-Length réponse), CloudFront ferme la connexion à l'origine et renvoie une erreur au visualiseur. (Lorsque la mise en cache est désactivée, CloudFront vous pouvez récupérer un objet dont la taille est supérieure à cette taille depuis l'origine et le transmettre au visualiseur. Cependant, CloudFront ne met pas l'objet en cache.)

Cependant, avec les demandes de plage, vous pouvez les utiliser CloudFront pour mettre en cache un objet dont la taille de fichier est supérieure à la taille de fichier maximale pouvant être mise en cache. Par exemple, prenez une origine avec un objet de 100 Go. Lorsque la mise en cache est activée, CloudFront aucun objet de cette taille ne peut être récupéré ou mis en cache. Toutefois, l’utilisateur peut envoyer plusieurs demandes de plage pour récupérer cet objet par parties, chacune d’entre elles étant inférieure à 50 Go. Par exemple, l’utilisateur peut demander l’objet dans des parties de 20 Go en envoyant une demande avec l’en-tête Range: bytes=0-21474836480 pour récupérer la première partie, une autre demande avec l’en-tête Range: bytes=21474836481-42949672960 pour récupérer la partie suivante, etc. Lorsque l’utilisateur a reçu toutes les parties, il peut les combiner pour construire l’objet d’origine de 100 Go. Dans ce cas, met en CloudFront cache chacune des parties de 20 Go de l'objet et peut répondre aux demandes ultérieures pour la même partie à partir du cache.