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:
Il file è compresso in formato gzip quando è archiviato in Cloud Storage.
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 rispostaContent-Encoding: gzip
.Se il campo di metadati
Cache-Control
dell'oggetto è impostato suno-transform
, l'oggetto viene pubblicato come oggetto compresso in tutte le richieste successive, indipendentemente dalle intestazioni delle richiesteAccept-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
siaContent-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 NOContent-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 unContent-Encoding
. Questa operazione potrebbe comportare l'impostazione di un valore predefinito perContent-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
- Scopri di più sul flag
--gzip-local
quando utilizzigcloud storage cp
, che applica la codifica dei contenuti gzip ai caricamenti di file. - Scopri come visualizzare e modificare i metadati degli oggetti.