Questa pagina illustra la conversione dei file verso e da uno stato compresso con gzip. La pagina include una panoramica della transcodifica, le best practice per lavorare con i metadati associati e il comportamento dei file compressi in Cloud Storage.
Transcodifica e gzip
gzip è una forma di compressione dei dati: in genere riduce le dimensioni di un file. In questo modo, il file può essere trasferito più rapidamente e archiviato utilizzando meno spazio rispetto a un file non 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 fornito a un richiedente. Quando la transcodifica ha come risultato un file compresso con gzip, può essere considerata compressiva, mentre quando il risultato è un file che non è più compresso con gzip, può essere considerata decompressione. Cloud Storage supporta la forma decompressiva della transcodifica.
Cloud Storage non supporta la transcodifica decompressiva per gli oggetti compressi con Brotli.
Transcodifica decompressiva
La transcodifica decompressiva ti consente di archiviare le versioni compresse dei file in Cloud Storage, il che riduce i costi di archiviazione a riposo, continuando al contempo a fornire il file stesso all'utente che lo richiede, senza alcuna compressione. Questa funzionalità è utile, ad esempio, per pubblicare file per i clienti.
Affinché la transcodifica decompressiva venga eseguita, un oggetto deve soddisfare due criteri:
Il file viene compresso con gzip quando viene archiviato in Cloud Storage.
I metadati dell'oggetto includono
Content-Encoding: gzip
.
Quando un oggetto soddisfa questi due criteri, viene sottoposto a transcodifica decompressiva quando viene pubblicato e la risposta contenente l'oggetto non contiene un'intestazione Content-Encoding
o Content-Length
.
Esistono due modi per impedire la transcodifica decompressiva di un oggetto altrimenti idoneo:
Se la richiesta dell'oggetto include un'intestazione
Accept-Encoding: gzip
, l'oggetto viene visualizzato così com'è nella richiesta specifica, insieme a un'intestazione di rispostaContent-Encoding: gzip
.Se il campo dei metadati
Cache-Control
dell'oggetto è impostato suno-transform
, l'oggetto viene pubblicato come oggetto compresso in tutte le richieste successive, indipendentemente dalle intestazioni di richiestaAccept-Encoding
.
La prevenzione della transcodifica decompressiva è utile, ad esempio, se vuoi ridurre il costo o il tempo del trasferimento dei dati in uscita o se vuoi convalidare gli oggetti scaricati con i checksum crc32c/md5 previsti.
Considerazioni
Quando utilizzi la transcodifica decompressiva, tieni presente quanto segue:
La transcodifica decompressiva invalida il controllo dell'integrità. Se i richiedenti dei tuoi dati si basano sul checksum per il controllo dell'integrità, non devi utilizzare la transcodifica decompressiva.
La transcodifica decompressiva ti consente di archiviare gli oggetti in Cloud Storage in uno stato compresso, risparmiando spazio e costi. Tuttavia, gli addebiti per il download dell'oggetto si basano sulle sue dimensioni decompresse, poiché queste sono le dimensioni dell'oggetto pubblicato.
Quando si accede da un bucket Cloud Storage montato con FUSE, gli oggetti non vengono sottoposti a transcodifica decompressiva e vengono letti come compressi.
Content-Type e Content-Encoding
Esistono diversi comportamenti che devi tenere presenti in merito al rapporto tra Content-Type
e Content-Encoding
e la transcodifica. Entrambi sono metadati memorizzati insieme a un oggetto. Consulta la sezione Visualizzazione e modifica dei metadati degli oggetti per istruzioni dettagliate su come aggiungere metadati agli 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. Sebbene non esista un controllo per garantire che il valore Content-Type
specificato corrisponda alla vera natura di un oggetto caricato, la specifica errata del tipo comporterà al massimo che i richiedenti ricevano qualcosa di diverso da ciò che si aspettavano e potrebbe portare a comportamenti indesiderati.
Content-Encoding
è facoltativo e, se vuoi, può essere incluso nel caricamento di file compressi. Ad esempio:
Content-Encoding: gzip
indica che l'oggetto caricato è compresso con gzip. Come per Content-Type
, non viene eseguito alcun controllo per garantire che il valore Content-Encoding
specificato venga effettivamente applicato all'oggetto caricato e la specifica errata della codifica di un oggetto potrebbe comportare un comportamento imprevisto nelle richieste di download successive.
Buone prassi
Quando carichi un oggetto compresso con gzip, il modo consigliato per impostare i metadati è specificare sia
Content-Type
cheContent-Encoding
. Ad esempio, per un file di testo normale compresso:Content-Type: text/plain Content-Encoding: gzip
In questo modo, chiunque acceda all'oggetto riceve le informazioni più dettagliate sul suo stato. In questo modo, l'oggetto diventa idoneo anche per la transcodificazione decompressiva quando viene scaricato in un secondo momento, consentendo alle applicazioni client di gestire correttamente la semantica di
Content-Type
.In alternativa, puoi caricare l'oggetto con
Content-Type
impostato su indica la compressione e NESSUNContent-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 il transcoding decompressivo.
Pratiche scoraggiate
Sebbene sia possibile, un file compresso con gzip non deve essere caricato con la natura compressa del file omessa. Ad esempio, per un file di testo normale compresso con gzip, dovresti evitare di impostare solo
Content-Type: text/plain
. In questo modo viene rappresentato in modo ingannevole lo stato dell'oggetto poiché verrà consegnato a un richiedente.Analogamente, gli oggetti non devono essere caricati con un
Content-Type
omesso, anche se è incluso unContent-Encoding
. In questo modo, il valoreContent-Type
potrebbe essere impostato su un valore predefinito, ma la richiesta potrebbe essere rifiutata, a seconda di come viene eseguito il caricamento.
Pratiche errate
Non devi impostare i metadati in modo che registrino 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 nuovamente compresso con gzip, cosa che di solito non accade (se effettivamente prevedi di comprimere un file due volte, consulta la sezione Utilizzare gzip sugli oggetti compressi di seguito). Quando avviene la transcodifica decompressiva su un oggetto segnalato erroneamente, l'oggetto viene pubblicato con codifica dell'identità, ma i richiedenti pensano di aver ricevuto un oggetto a cui è associato ancora un livello di compressione. I tentativi di decomprimere l'oggetto non andranno a buon fine.
Analogamente, non devi caricare un file non compresso con gzip con
Content-Encoding: gzip
. In questo modo, l'oggetto sembra 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, oltre ai file gzip stessi, sono già compressi. L'utilizzo di gzip su questi oggetti non offre praticamente alcun vantaggio: in quasi tutti i casi, l'oggetto diventa più grande a causa del sovraccarico di gzip. Per questo motivo, l'utilizzo di gzip sui contenuti compressi è generalmente sconsigliato e potrebbe causare comportamenti indesiderati.
Ad esempio, sebbene Cloud Storage consenta di caricare e archiviare oggetti "doppiamente compressi" (ovvero oggetti compressi con gzip, ma con un Content-Type
sottostante anche esso compresso), non consente di servire oggetti in uno stato doppiamente compresso, a meno che i metadati Cache-Control
non includano no-transform
. Rimuove invece il livello di compressione gzip esterno, elimina l'intestazione di risposta Content-Encoding
e pubblica l'oggetto risultante. Ciò si verifica anche per le richieste con Accept-Encoding: gzip
.
Il file ricevuto dal client non ha lo stesso checksum di quello caricato e archiviato in Cloud Storage, pertanto tutti i controlli di integrità non vanno a buon fine.
Utilizzare l'intestazione Range
Quando si verifica la transcodifica, se la richiesta dell'oggetto include un'intestazione Range
, questa viene ignorata. Ciò significa che le richieste di contenuti parziali non vengono soddisfatte e la risposta serve invece l'intero oggetto richiesto. Ad esempio, se hai un oggetto di 10 GB idoneo per il transcoding, ma includi l'intestazione Range: bytes=0-10000
nella richiesta, ricevi comunque l'intero oggetto di 10 GB.
Questo comportamento si verifica perché non è possibile selezionare un intervallo da un file compresso senza prima decomprimerlo nella sua interezza: ogni richiesta di parte di un file sarebbe accompagnata dalla decompressione dell'intero file, potenzialmente di grandi dimensioni, che utilizzerebbe male le risorse. Tieni presente questo comportamento ed evita di utilizzare l'intestazione Range
quando utilizzi la transcodifica, poiché gli addebiti vengono effettuati per la trasmissione dell'intero oggetto e non solo dell'intervallo richiesto.
Per ulteriori informazioni sul comportamento consentito delle risposte 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. Per farlo, scegli inizialmente le proprietà appropriate quando carichi gli oggetti. Ad esempio,
le richieste di intervallo per gli oggetti con Content-Type: application/gzip
e senza
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.