Richieste batch

In seguito alla ritiro degli endpoint HTTP batch globali, le richieste HTTP in batch che hanno come target solo le API BigQuery smetteranno di funzionare il 1° giugno 2021. Se l'applicazione invia batch HTTP richieste, sostituisci le richieste HTTP batch con richieste HTTP singole prima del 1° giugno 2021.

Per informazioni sul ritiro, consulta la seguente sezione di domande frequenti. Per la documentazione su come eseguire in batch le richieste HTTP, vedi Raggruppamento delle richieste in batch.

Domande frequenti sul ritiro dell'API batch HTTP di BigQuery

Perché le richieste HTTP batch di BigQuery sono deprecate?

Il supporto per gli endpoint batch HTTP globali si basava su un'architettura che utilizzava un unico proxy condiviso per ricevere richieste per tutte le API. Con lo spostamento di Google verso un'architettura più distribuita e ad alte prestazioni dove le richieste vengono inviate direttamente al server API appropriato, potremmo non supportano più questi endpoint globali.

Il passaggio successivo consiste nel ritirare le richieste HTTP batch di BigQuery. Viene distribuito anche il servizio BigQuery. I metodi con QPS elevate sono gestiti da backend dedicati. Tutte le regioni sono isolate, ma le richieste HTTP in batch può causare il fanout delle richieste tra regioni. Ciò rende il batch inefficiente generano una maggiore latenza di elaborazione, il che è opposto all'obiettivo originale per le richieste HTTP in batch.

Che cosa è deprecato nello specifico?

I seguenti metodi di richiesta batch per interagire con le API BigQuery non funzioneranno più:

Come faccio a eseguire la migrazione?

La maggior parte degli utenti di BigQuery non utilizza richieste HTTP batch. Se stai ancora utilizzando le richieste batch, usa i seguenti esempi per sostituire raggruppano le richieste HTTP con richieste HTTP individuali.

REST

Invia singole richieste HTTP come documentato nel Sezione di riferimento dell'API BigQuery. Non combinare le richieste in batch utilizzando Percorso /batch/v2/bigquery.

JavaScript

Se usi JavaScript, inizi con un blocco di codice simile a questo:

// Notice that the outer batch request contains inner API requests
// for two different APIs.

// Request to urlshortener API
request1 = gapi.client.urlshortener.url.get({"shortUrl":
"http://goo.gl/fbsS"});

// Request to zoo API
request2 = gapi.client.zoo.animals.list();

// Request to urlshortener API
request3 = gapi.client.urlshortener.url.get({"shortUrl":
"https://goo.gl/XYFuPH"});

// Request to zoo API
request4 = gapi.client.zoo.animal().get({"name": "giraffe"});

// Creating a batch request object
batchRequest = gapi.client.newBatch();
// adding the 4 batch requests
batchRequest.add(request1);
batchRequest.add(request2);
batchRequest.add(request3);
batchRequest.add(request4);
// print the batch request
batchRequest.then(x=>console.log(x))

Sostituisci il blocco di codice precedente con un blocco di codice simile al seguenti:

// Request to urlshortener API
request1 = gapi.client.urlshortener.url.get({"shortUrl": "http://goo.gl/fbsS"});

// Request to zoo API
request2 = gapi.client.zoo.animals.list();

// Request to urlshortener API
request3 = gapi.client.urlshortener.url.get({"shortUrl": "http://goo.gl/fbsS"})

// Request to zoo API
request4 = gapi.client.zoo.animals.list();

// print the 4 individual requests
Promise.all([request1, request2, request3, request4])
    .then(x=>console.log(x));

Python

Se utilizzi Python, inizi con un blocco di codice simile a questo:

from apiclient.http import BatchHttpRequest

def insert_animal(request_id, response, exception):
  if exception is not None: # Do something with the exception
    pass
  else: # Do something with the response
    pass

service = build('farm', 'v2')
batch = service.new_batch_http_request(callback=insert_animal)
batch.add(service.animals().insert(name="sheep"))
batch.add(service.animals().insert(name="pig"))
batch.add(service.animals().insert(name="llama"))
batch.execute(http=http)

Sostituisci il blocco di codice precedente con un blocco di codice simile al seguenti:

# import a new API to create a thread pool
from concurrent.futures import ThreadPoolExecutor as PoolExecutor

def run_it(request):
  print(request.execute())

service = build('farm', 'v2')
request1 = service.animals().insert(name="sheep")
request2 = service.animals().insert(name="pig")
request3 = service.animals().insert(name="llama")
with PoolExecutor(max_workers=4) as executor:
  for _ in executor.map(run_it,[request1, request2, request3]):
    pass

Altre lingue

Come negli esempi precedenti, sostituisci BatchRequest chiamate con richieste individuali.

Ricevi assistenza per la migrazione

Per assistenza con la migrazione, puoi porre domande Impilare Extra. I tecnici di Google monitorano e rispondono alle domande utilizzando il tag google-bigquery. Usa questo tag quando fai domande. Il nostro obiettivo è rispondere a tutte le domande per un periodo di tempo ragionevole.

Creazione di batch di richieste

Questo documento mostra come raggruppare le chiamate API in batch per ridurre il numero di connessioni HTTP che il cliente deve effettuare.

Questo documento riguarda nello specifico la creazione di una richiesta batch mediante l'invio di un richiesta HTTP. Se, invece, utilizzi una libreria client di Google per effettuare una richiesta batch, consulta la documentazione della libreria client.

Panoramica

Ogni connessione HTTP effettuata dal client determina un certo overhead. L'API BigQuery supporta la creazione in batch, per consentire al client di inserire diverse chiamate API in una singola richiesta HTTP.

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

  • Hai appena iniziato a utilizzare l'API e hai molti dati da caricare.
  • Un utente ha apportato modifiche ai dati mentre la tua applicazione era offline (disconnessa da internet), quindi l'applicazione deve sincronizzare i dati locali con il server inviando molti aggiornamenti ed eliminazioni.

In ogni caso, invece di inviare ogni chiamata separatamente, puoi raggrupparle in un'unica richiesta HTTP. Tutte le richieste interne devono andare alla stessa API di Google.

Non puoi superare le 1000 chiamate in una singola richiesta batch. Se devi effettuare un numero maggiore di chiamate, utilizza più richieste batch.

Nota: il sistema batch per l'API BigQuery utilizza la stessa sintassi del sistema di elaborazione batch OData, ma la semantica è diversa.

Dettagli batch

Una richiesta batch è composta da più chiamate API combinate in un'unica richiesta HTTP, che può essere inviata all'indirizzo batchPath specificato nel documento di rilevamento API. Il percorso predefinito è /batch/api_name/api_version. Questa sezione descrive in dettaglio la sintassi batch; in seguito puoi trovare un esempio.

Nota: un insieme di n richieste raggruppate insieme viene conteggiata ai fini del limite di utilizzo come richieste di n, non come una singola richiesta. La richiesta batch viene separata in un insieme di richieste prima dell'elaborazione.

Formato di una richiesta batch

Una richiesta batch è una singola richiesta HTTP standard contenente più chiamate API BigQuery, che utilizza il tipo di contenuto multipart/mixed. All'interno di questa richiesta HTTP principale, ciascuna parte contiene una richiesta HTTP nidificata.

Ogni parte inizia con la propria intestazione HTTP Content-Type: application/http. Può anche avere un'intestazione Content-ID facoltativa. Tuttavia, le intestazioni delle parti servono solo a contrassegnare l'inizio della parte; e sono separate dalla richiesta nidificata. Dopo che il server ha decriptato la richiesta batch in richieste separate, le intestazioni delle parti vengono ignorate.

Il corpo di ogni parte è una richiesta HTTP completa, con il proprio verbo, URL, intestazioni e corpo. La richiesta HTTP deve contenere solo la parte del percorso dell'URL. Non sono consentiti URL completi nelle richieste batch.

Le intestazioni HTTP per la richiesta batch esterna, fatta eccezione per le intestazioni Content- come Content-Type, si applicano a tutte le richieste nel batch. Se specifichi una determinata intestazione HTTP sia nella richiesta esterna sia in una singola chiamata, il valore dell'intestazione di chiamata singola sostituisce il valore dell'intestazione della richiesta batch esterna. Le intestazioni di una singola chiamata si applicano solo a quella chiamata.

Ad esempio, se fornisci un'intestazione Autorizzazione per una chiamata specifica, questa intestazione si applica solo a quella chiamata. Se fornisci un'intestazione di autorizzazione per la richiesta esterna, questa intestazione si applica a tutte le singole chiamate, a meno che non la sostituiscano con intestazioni di autorizzazione proprie.

Quando il server riceve la richiesta in batch, applica i parametri di ricerca e le intestazioni (a seconda dei casi) della richiesta esterna a ogni parte, quindi tratta ogni parte come se fosse una richiesta HTTP separata.

Risposta a una richiesta batch

La risposta del server è una singola risposta HTTP standard con un tipo di contenuti multipart/mixed; ciascuna parte è la risposta a una delle richieste nella richiesta in batch, nello stesso ordine delle richieste.

Come le parti della richiesta, ogni parte della risposta contiene una risposta HTTP completa, inclusi un codice di stato, intestazioni e corpo. E come le parti nella richiesta, ogni parte della risposta è preceduta da un'intestazione Content-Type che segna l'inizio della parte.

Se una determinata parte della richiesta aveva un'intestazione Content-ID, la parte corrispondente della risposta ha un'intestazione Content-ID corrispondente, con il valore originale preceduto dalla stringa response-, come mostrato nell'esempio seguente.

Nota: il server potrebbe eseguire le chiamate in qualsiasi ordine. Non fare affidamento sulla loro esecuzione nell'ordine in cui li hai specificati. Se vuoi assicurarti che due chiamate avvengano in un determinato ordine, non puoi inviarle in un'unica richiesta; invia la prima risposta da sola, quindi attendi la risposta alla prima prima di inviare la seconda.

Esempio

L'esempio seguente mostra l'uso della creazione in batch con un'API demo generica (fittizia) denominata API Farm. Tuttavia, gli stessi concetti si applicano anche all'API BigQuery.

Esempio di richiesta batch

POST /batch/farm/v1 HTTP/1.1
Authorization: Bearer your_auth_token
Host: www.googleapis.com
Content-Type: multipart/mixed; boundary=batch_foobarbaz
Content-Length: total_content_length

--batch_foobarbaz
Content-Type: application/http
Content-ID: <item1:12930812@barnyard.example.com>

GET /farm/v1/animals/pony

--batch_foobarbaz
Content-Type: application/http
Content-ID: <item2:12930812@barnyard.example.com>

PUT /farm/v1/animals/sheep
Content-Type: application/json
Content-Length: part_content_length
If-Match: "etag/sheep"

{
  "animalName": "sheep",
  "animalAge": "5"
  "peltColor": "green",
}

--batch_foobarbaz
Content-Type: application/http
Content-ID: <item3:12930812@barnyard.example.com>

GET /farm/v1/animals
If-None-Match: "etag/animals"

--batch_foobarbaz--

Esempio di risposta batch

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

HTTP/1.1 200
Content-Length: response_total_content_length
Content-Type: multipart/mixed; boundary=batch_foobarbaz

--batch_foobarbaz
Content-Type: application/http
Content-ID: <response-item1:12930812@barnyard.example.com>

HTTP/1.1 200 OK
Content-Type application/json
Content-Length: response_part_1_content_length
ETag: "etag/pony"

{
  "kind": "farm#animal",
  "etag": "etag/pony",
  "selfLink": "/farm/v1/animals/pony",
  "animalName": "pony",
  "animalAge": 34,
  "peltColor": "white"
}

--batch_foobarbaz
Content-Type: application/http
Content-ID: <response-item2:12930812@barnyard.example.com>

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: response_part_2_content_length
ETag: "etag/sheep"

{
  "kind": "farm#animal",
  "etag": "etag/sheep",
  "selfLink": "/farm/v1/animals/sheep",
  "animalName": "sheep",
  "animalAge": 5,
  "peltColor": "green"
}

--batch_foobarbaz
Content-Type: application/http
Content-ID: <response-item3:12930812@barnyard.example.com>

HTTP/1.1 304 Not Modified
ETag: "etag/animals"

--batch_foobarbaz--