Transcodifica di file compressi con gzip

Questa pagina illustra la conversione dei file da e verso uno stato compresso in gzip. La pagina include una panoramica sulla transcodifica, le best practice per l'utilizzo dei metadati associati e il comportamento dei file compressi in Cloud Storage.

Transcodifica e gzip

gzip è una forma di compressione dei dati: generalmente riduce le dimensioni di un file. In questo modo il file viene trasferito più velocemente e viene archiviato utilizzando meno spazio rispetto a quanto accadrebbe se non fosse compresso. La compressione di un file può ridurre i costi e i tempi di trasferimento. La transcodifica, in Cloud Storage, è la modifica automatica della compressione di un file prima che venga pubblicato per un richiedente. Quando la transcodifica fa sì che un file diventi compresso con gzip, il risultato può essere considerato compressivo, mentre quando il risultato è un file non più compresso con gzip, può essere considerato decompressivo. Cloud Storage supporta la forma decompressa di transcodifica.

Cloud Storage non supporta la transcodifica decompressa per gli oggetti compressi con Brotli.

Transcodifica decompressiva

La transcodifica decompressa consente di archiviare versioni compresse dei file in Cloud Storage, il che riduce i costi di archiviazione at-rest, pur inviando il file stesso al richiedente, senza alcuna compressione. Questo è utile, ad esempio, per la pubblicazione di file ai clienti.

Affinché si verifichi la transcodifica decompressa, un oggetto deve soddisfare due criteri:

  1. Il file è compresso in formato gzip quando è archiviato in Cloud Storage.

  2. I metadati dell'oggetto includono Content-Encoding: gzip.

Quando un oggetto soddisfa questi due criteri, viene sottoposto a transcodifica decompressa al momento della pubblicazione e la risposta che contiene l'oggetto non contiene un'intestazione Content-Encoding o Content-Length.

Esistono due modi per evitare che la transcodifica decompressa si verifichi per un oggetto altrimenti idoneo:

  • Se la richiesta dell'oggetto include un'intestazione Accept-Encoding: gzip, l'oggetto viene pubblicato così com'è in quella richiesta specifica, insieme a un'intestazione della risposta Content-Encoding: gzip.

  • Se il campo di metadati Cache-Control dell'oggetto è impostato su no-transform, l'oggetto viene pubblicato come oggetto compresso in tutte le richieste successive, indipendentemente dalle intestazioni delle richieste Accept-Encoding.

Impedire la transcodifica decompressa è utile, ad esempio, se vuoi ridurre i costi o i tempi di trasferimento dei dati in uscita o se vuoi convalidare gli oggetti scaricati che abbiano i checksum crc32c/md5 previsti.

Considerazioni

Quando lavori con la transcodifica decompressa, tieni presente quanto segue:

  • La transcodifica decompressa invalida il controllo dell'integrità dei dati restituiti nella risposta. Questo perché l'hash archiviato con un oggetto rappresenta i dati nello stato compresso, mentre per i dati pubblicati viene rimossa la compressione e, di conseguenza, un valore hash diverso. Se i richiedenti dei tuoi dati si affidano al checksum per il controllo dell'integrità, non devi utilizzare la transcodifica decompressa.

  • La transcodifica decompressa consente di archiviare oggetti in Cloud Storage in stato compresso, con un conseguente risparmio di spazio e costi. Tuttavia, gli addebiti per il download dell'oggetto si basano sulle sue dimensioni decompresse, che corrispondono a quelle dell'oggetto pubblicato.

  • Quando si accede da un bucket montato su Cloud Storage FUSE, gli oggetti non vengono sottoposti a transcodifica decompressa e vengono letti come compressi.

Content-Type e Content-Encoding

Esistono diversi comportamenti da tenere presenti per quanto riguarda la correlazione tra Content-Type e Content-Encoding e la transcodifica. Entrambi sono metadati archiviati insieme a un oggetto. Per istruzioni dettagliate su come aggiungere metadati agli oggetti, consulta Visualizzazione e modifica dei metadati degli oggetti.

Content-Type deve essere incluso in tutti i caricamenti e indica il tipo di oggetto caricato. Ad esempio:

Content-Type: text/plain

indica che l'oggetto caricato è un file di testo normale. Anche se non è presente alcun controllo per garantire che il valore Content-Type specificato corrisponda alla vera natura di un oggetto caricato, specificare in modo errato il tipo potrebbe far sì che i richiedenti ricevano qualcosa di diverso da quello che si aspettavano e potrebbero causare comportamenti involontari.

Content-Encoding è facoltativo e può, se lo desideri, essere incluso nel caricamento dei file compressi. Ad esempio:

Content-Encoding: gzip

indica che l'oggetto caricato è compresso con gzip. Come per Content-Type, non esiste un controllo per garantire che il valore Content-Encoding specificato venga effettivamente applicato all'oggetto caricato e specificare in modo errato la codifica di un oggetto potrebbe causare comportamenti indesiderati nelle richieste di download successive.

Buone pratiche

  • Quando carichi un oggetto compresso con gzip, il modo consigliato per impostare i tuoi metadati è specificare sia Content-Type sia Content-Encoding. Ad esempio, per un file di testo normale compresso:

    Content-Type: text/plain
    Content-Encoding: gzip
    

    In questo modo tutte le informazioni sullo stato dell'oggetto sono disponibili per chiunque vi acceda. Così facendo, l'oggetto diventa inoltre idoneo per la transcodifica decompressa quando viene scaricato successivamente, consentendo alle applicazioni client di gestire correttamente la semantica di Content-Type.

  • In alternativa, puoi caricare l'oggetto con Content-Type impostato per indicare la compressione e NO Content-Encoding. Ad esempio:

    Content-Type: application/gzip
    

    Tuttavia, in questo caso l'unica cosa immediatamente nota sull'oggetto è che è compresso con gzip, senza informazioni sul tipo di oggetto sottostante. Inoltre, l'oggetto non è idoneo per la transcodifica decompressa.

Pratiche scoraggiate

  • Sebbene sia possibile farlo, un file compresso con gzip non deve essere caricato con la natura compressa del file omesso. Ad esempio, per un file di testo normale compresso con gzip, dovresti evitare di impostare solo Content-Type: text/plain. Questo rappresenta in modo ingannevole lo stato dell'oggetto, che sarà consegnato a un richiedente.

  • Analogamente, gli oggetti non devono essere caricati con un valore Content-Type omesso, anche se è incluso un Content-Encoding. Questa operazione potrebbe comportare l'impostazione di un valore predefinito per Content-Type, ma potrebbe comportare il rifiuto della richiesta, a seconda di come viene eseguito il caricamento.

Pratiche errate

  • Non devi impostare i metadati in modo da segnalare in modo ridondante la compressione dell'oggetto:

    Content-Type: application/gzip
    Content-Encoding: gzip
    

    Ciò implica che stai caricando un oggetto compresso con gzip che è stato compresso con gzip una seconda volta, quando in genere non è così (se hai effettivamente intenzione di comprimere un file due volte, consulta la sezione Utilizzare gzip su oggetti compressi di seguito). Quando si verifica la transcodifica decompressa su un oggetto segnalato in modo errato, all'oggetto viene pubblicata con identità codificata, ma i richiedenti pensano di aver ricevuto un oggetto a cui è ancora associato un livello di compressione. I tentativi di decompressione dell'oggetto non andranno a buon fine.

  • Analogamente, un file non compresso con gzip non deve essere caricato con Content-Encoding: gzip. In questo modo l'oggetto appare per essere idoneo per la transcodifica, ma quando vengono effettuate richieste per l'oggetto, i tentativi di transcodifica non vanno a buon fine.

Utilizzo di gzip su oggetti compressi

Alcuni oggetti, come molti file video, audio e immagine, e i file gzip, sono già compressi. L'uso di gzip su questi oggetti non offre praticamente alcun vantaggio: in quasi tutti i casi, questo aumenta le dimensioni dell'oggetto a causa dell'overhead di gzip. Per questo motivo, in genere l'uso di gzip su contenuti compressi è sconsigliato e potrebbe causare comportamenti indesiderati.

Ad esempio, anche se Cloud Storage consente di caricare e archiviare oggetti "doppiamente compressi", ovvero oggetti compressi in gzip ma che hanno anche un elemento Content-Type sottostante compresso, non consente la pubblicazione di oggetti in uno stato doppiamente compresso, a meno che i relativi metadati Cache-Control non includano no-transform. Rimuove invece il livello esterno, gzip, di compressione, elimina l'intestazione della risposta Content-Encoding e pubblica l'oggetto risultante. Questo si verifica anche per le richieste con Accept-Encoding: gzip. Il file ricevuto dal client non ha quindi lo stesso checksum di ciò che è stato caricato e archiviato in Cloud Storage, perciò eventuali controlli di integrità non vanno a buon fine.

Utilizzo dell'intestazione Intervallo

Durante la transcodifica, se la richiesta per l'oggetto include un'intestazione Range, questa viene ignorata automaticamente. Ciò significa che le richieste di contenuti parziali non vengono soddisfatte e la risposta pubblica invece l'intero oggetto richiesto. Ad esempio, se hai un oggetto da 10 GB idoneo per la transcodifica, ma includi l'intestazione Range: bytes=0-10000 nella richiesta, riceverai comunque l'intero oggetto da 10 GB.

Questo comportamento si verifica perché non è possibile selezionare un intervallo da un file compresso senza prima decomprimere il file nella sua interezza: ogni richiesta di parte di un file sarebbe accompagnata dalla decompressione dell'intero file, potenzialmente di grandi dimensioni, che userebbe in modo scarso le risorse. Devi tenere conto di questo comportamento ed evitare di utilizzare l'intestazione Range quando utilizzi la transcodifica, in quanto vengono addebitati costi per la trasmissione dell'intero oggetto e non solo per l'intervallo richiesto. Per ulteriori informazioni sul comportamento di risposta consentito alle richieste con intestazioni Range, consulta la specifica.

Se sono necessarie richieste con intestazioni Range, devi assicurarti che la transcodifica non venga eseguita per l'oggetto richiesto. Puoi farlo scegliendo le proprietà appropriate quando carichi oggetti. Ad esempio, le richieste di intervallo per gli oggetti con Content-Type: application/gzip e nessun Content-Encoding vengono eseguite come richiesto.

Passaggi successivi