Invio di richieste batch

Questo documento mostra come raggruppare le chiamate API JSON per ridurre il numero di Connessioni HTTP che il client deve stabilire quando accede a Cloud Storage.

Panoramica

Ogni connessione HTTP effettuata dal client genera una certa quantità di overhead. L'API JSON di Cloud Storage supporta il batch, per consentire al client in un'unica richiesta HTTP.

Esempi di situazioni in cui è possibile utilizzare la gestione in batch:

  • Aggiornamento dei metadati, ad esempio le autorizzazioni, su molti oggetti.
  • Eliminazione di molti oggetti.

In ogni caso, invece di inviare ogni chiamata separatamente, puoi raggrupparle in una singola richiesta HTTP. Tutte le richieste interne devono andare API JSON di Cloud Storage.

Non devi includere più di 100 chiamate in una singola richiesta batch. Se se devi fare più chiamate, usa più richieste batch. Il batch totale il payload della richiesta deve essere inferiore a 10 MB.

Dettagli batch

Una richiesta batch è composta da più chiamate API combinate in un'unica richiesta HTTP, che può essere inviato all'endpoint batch di Cloud Storage, https://storage.googleapis.com/batch/storage/v1. Questa sezione descrive la sintassi batch in dettaglio; in seguito puoi trovare un esempio.

Formato di una richiesta batch

Una richiesta batch è una singola richiesta HTTP standard contenente Chiamate API JSON di Cloud Storage. Questa richiesta principale utilizza multipart/mixed tipo di contenuti. All'interno della richiesta HTTP principale, ci sono più parti ognuno dei quali contiene una richiesta HTTP nidificata.

Ogni parte inizia con la propria intestazione HTTP Content-Type: application/http. La parte può anche avere un'intestazione Content-ID facoltativa. Queste intestazioni all'inizio della parte, ma sono separati dalla struttura HTTP nidificata richiesta. Ciò significa che, dopo che il server ha decriptato la richiesta batch richieste separate, le intestazioni delle parti vengono ignorate.

Il corpo di ogni parte è di per sé una richiesta HTTP completa, con un proprio verbo, URL, intestazioni e corpo. Queste richieste HTTP devono contenere solo la parte del percorso dell'URL; Gli URL completi possono avere un comportamento indefinito.

Le intestazioni HTTP per la richiesta batch esterna, ad eccezione delle intestazioni Content- come Content-Type, si applicano anche a tutte le richieste nidificate. Tuttavia, se specifichi una determinata intestazione HTTP sia nella richiesta esterna sia in una richiesta nidificata, il valore dell'intestazione della richiesta nidificata sostituisce la richiesta batch esterna il valore dell'intestazione per quella specifica richiesta.

Ad esempio, se fornisci un'intestazione Authorization per uno specifico segmento nidificato questa intestazione si applica solo alla richiesta che l'ha specificata. Se fornire un'intestazione Authorization per la richiesta esterna, poi quell'intestazione si applica a tutte le richieste nidificate a meno che non lo sostituiscano con Authorization intestazione propria.

Quando Cloud Storage riceve la richiesta in batch, applica lo stato parametri di ricerca e intestazioni (se appropriato) della richiesta a ogni parte e quindi tratta ogni parte come se fosse una richiesta HTTP separata.

Risposta a una richiesta batch

La risposta di Cloud Storage è una singola risposta HTTP standard con un tipo di contenuti multipart/mixed; ogni parte di questa risposta principale è la risposta a una delle richieste nella richiesta in batch. L'ordine delle risposte è il come le richieste.

Come tutte le parti in una richiesta, ogni parte della risposta contiene un prompt HTTP completo della risposta, inclusi un codice di stato, intestazioni e un corpo. E come le parti in ogni parte della risposta è preceduta da un'intestazione Content-Type segna l'inizio della parte. Per ulteriori informazioni sui codici di stato, vedi Codici di errore e di stato HTTP per l'API JSON di Cloud Storage.

Se una determinata parte della richiesta aveva un'intestazione Content-ID, il codice corrispondente parte della risposta ha un'intestazione Content-ID corrispondente. Intestazione Content-ID della risposta inizia con response-, seguito dal valore Content-ID utilizzato nella richiesta, come mostrato nell'esempio.

Esempio

Il seguente esempio batch aggiorna i metadati personalizzati per tre oggetti a example-bucket.

Esempio di richiesta HTTP batch

HTTP

POST /batch/storage/v1 HTTP/1.1
Host: storage.googleapis.com
Content-Length: 960
Content-Type: multipart/mixed; boundary="===============7330845974216740156=="
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

--===============7330845974216740156==
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+1>

PATCH /storage/v1/b/example-bucket/o/obj1 HTTP/1.1
Content-Type: application/json
accept: application/json
content-length: 31

{"metadata": {"type": "tabby"}}
--===============7330845974216740156==
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+2>

PATCH /storage/v1/b/example-bucket/o/obj2 HTTP/1.1
Content-Type: application/json
accept: application/json
content-length: 32

{"metadata": {"type": "tuxedo"}}
--===============7330845974216740156==
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: <b29c5de2-0db4-490b-b421-6a51b598bd22+3>

PATCH /storage/v1/b/example-bucket/o/obj3 HTTP/1.1
Content-Type: application/json
accept: application/json
content-length: 32

{"metadata": {"type": "calico"}}
--===============7330845974216740156==--

Librerie client

C++

La libreria client C++ non supporta le richieste in batch.

C#

La libreria client C# non supporta le richieste in batch.

Vai

La libreria client Go non supporta le richieste in batch.

Java

Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Java di Cloud Storage.

import com.google.api.gax.paging.Page;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageBatch;
import com.google.cloud.storage.StorageOptions;
import java.util.HashMap;
import java.util.Map;

public class BatchSetObjectMetadata {
  public static void batchSetObjectMetadata(
      String projectId, String bucketName, String directoryPrefix) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The directory prefix. All objects in the bucket with this prefix will have their metadata
    // updated
    // String directoryPrefix = "yourDirectory/";

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Map<String, String> newMetadata = new HashMap<>();
    newMetadata.put("keyToAddOrUpdate", "value");
    Page<Blob> blobs =
        storage.list(
            bucketName,
            Storage.BlobListOption.prefix(directoryPrefix),
            Storage.BlobListOption.currentDirectory());
    StorageBatch batchRequest = storage.batch();

    // Add all blobs with the given prefix to the batch request
    for (Blob blob : blobs.iterateAll()) {
      batchRequest.update(blob.toBuilder().setMetadata(newMetadata).build());
    }

    // Execute the batch request
    batchRequest.submit();

    System.out.println(
        "All blobs in bucket "
            + bucketName
            + " with prefix '"
            + directoryPrefix
            + "' had their metadata updated.");
  }
}

Node.js

La libreria client Node.js non supporta le richieste in batch.

PHP

La libreria client PHP non supporta le richieste in batch.

Python

Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python di Cloud Storage.


from google.cloud import storage


def batch_request(bucket_name, prefix=None):
    """
    Use a batch request to patch a list of objects with the given prefix in a bucket.

    Note that Cloud Storage does not support batch operations for uploading or downloading.
    Additionally, the current batch design does not support library methods whose return values
    depend on the response payload.
    See https://cloud.google.com/python/docs/reference/storage/latest/google.cloud.storage.batch
    """
    # The ID of your GCS bucket
    # bucket_name = "my-bucket"
    # The prefix of the object paths
    # prefix = "directory-prefix/"

    client = storage.Client()
    bucket = client.bucket(bucket_name)

    # Accumulate in a list the objects with a given prefix.
    blobs_to_patch = [blob for blob in bucket.list_blobs(prefix=prefix)]

    # Use a batch context manager to edit metadata in the list of blobs.
    # The batch request is sent out when the context manager closes.
    # No more than 100 calls should be included in a single batch request.
    with client.batch():
        for blob in blobs_to_patch:
            metadata = {"your-metadata-key": "your-metadata-value"}
            blob.metadata = metadata
            blob.patch()

    print(
        f"Batch request edited metadata for all objects with the given prefix in {bucket.name}."
    )

Ruby

Per scoprire come effettuare una richiesta batch utilizzando Ruby, consulta Documentazione di riferimento dell'API Ruby di Cloud Storage.

Esempio di risposta HTTP batch

Questa è la risposta alla richiesta di esempio HTTP nella sezione precedente.

HTTP/1.1 200 OK
Content-Type: multipart/mixed; boundary=batch_pK7JBAk73-E=_AA5eFwv4m2Q=
Date: Mon, 22 Jan 2018 18:56:00 GMT
Expires: Mon, 22 Jan 2018 18:56:00 GMT
Cache-Control: private, max-age=0
Content-Length: 3767

--batch_pK7JBAk73-E=_AA5eFwv4m2Q=
Content-Type: application/http
Content-ID: <response-b29c5de2-0db4-490b-b421-6a51b598bd22+1>

HTTP/1.1 200 OK
ETag: "lGaP-E0memYDumK16YuUDM_6Gf0/V43j6azD55CPRGb9b6uytDYl61Y"
Content-Type: application/json; charset=UTF-8
Date: Mon, 22 Jan 2018 18:56:00 GMT
Expires: Mon, 22 Jan 2018 18:56:00 GMT
Cache-Control: private, max-age=0
Content-Length: 846

{
 "kind": "storage#object",
 "id": "example-bucket/obj1/1495822576643790",
 .
 .
 .
 "metadata": {
  "type": "tabby"
  },
  .
  .
  .
}

--batch_pK7JBAk73-E=_AA5eFwv4m2Q=
Content-Type: application/http
Content-ID: <response-b29c5de2-0db4-490b-b421-6a51b598bd22+2>

HTTP/1.1 200 OK
ETag: "lGaP-E0memYDumK16YuUDM_6Gf0/91POdd-sxSAkJnS8Dm7wMxBSDKk"
Content-Type: application/json; charset=UTF-8
Date: Mon, 22 Jan 2018 18:56:00 GMT
Expires: Mon, 22 Jan 2018 18:56:00 GMT
Cache-Control: private, max-age=0
Content-Length: 846

{
 "kind": "storage#object",
 "id": "example-bucket/obj2/1495822576643790",
 .
 .
 .
 "metadata": {
  "type": "tuxedo"
  },
  .
  .
  .
}

--batch_pK7JBAk73-E=_AA5eFwv4m2Q=
Content-Type: application/http
Content-ID: <response-b29c5de2-0db4-490b-b421-6a51b598bd22+3>

HTTP/1.1 200 OK
ETag: "lGaP-E0memYDumK16YuUDM_6Gf0/d2Z1F1_ZVbB1dC0YKM9rX5VAgIQ"
Content-Type: application/json; charset=UTF-8
Date: Mon, 22 Jan 2018 18:56:00 GMT
Expires: Mon, 22 Jan 2018 18:56:00 GMT
Cache-Control: private, max-age=0
Content-Length: 846

{
 "kind": "storage#object",
 "id": "example-bucket/obj3/1495822576643790",
 .
 .
 .
 "metadata": {
  "type": "calico"
  },
  .
  .
  .
}

--batch_pK7JBAk73-E=_AA5eFwv4m2Q=--

Se la richiesta complessiva non è formattata correttamente e Cloud Storage non è in grado di analizzarlo nelle richieste secondarie, ricevi un errore 400. Altrimenti, Cloud Storage restituisce un codice di stato 200, anche se alcuni o tutti i non riuscite.

Quando la richiesta complessiva viene restituita con il codice di stato 200, la risposta contiene i risultati per ogni richiesta secondaria, incluso un codice di stato per ciascuna, che indica se la richiesta secondaria è andata a buon fine o meno. Ad esempio: quando elimini gli oggetti in batch, ogni richiesta secondaria riuscita contiene Codice di stato 204 No Content.