Richieste batch
A seguito del ritiro degli endpoint HTTP batch globali, le richieste HTTP batch che hanno come target solo le API BigQuery smetteranno di funzionare il 1° giugno 2021. Se la tua applicazione invia richieste HTTP batch con singole richieste HTTP sostituisci le richieste HTTP batch con richieste HTTP individuali prima del 1° giugno 2021.
Per informazioni sul ritiro, consulta la seguente sezione di domande frequenti. Per la documentazione su come eseguire il batch delle richieste HTTP, consulta Richiesta di batch.
Domande frequenti sul ritiro dell'API HTTP batch BigQuery
Perché le richieste HTTP batch BigQuery sono deprecate?
Il supporto per gli endpoint batch HTTP globali era basato su un'architettura che utilizzava un singolo proxy condiviso per ricevere le richieste per tutte le API. Man mano che Google è passata a un'architettura più distribuita e ad alte prestazioni in cui le richieste passano direttamente al server API appropriato, non abbiamo più potuto supportare questi endpoint globali.
Il passaggio successivo deve essere il ritiro delle richieste HTTP batch di BigQuery. Anche il servizio BigQuery è distribuito. I metodi con QPS elevato sono gestiti da backend dedicati. Tutte le regioni sono isolate, ma le richieste HTTP batch possono causare il fanout delle richieste tra regioni. Ciò rende il batch inefficiente e può comportare una maggiore latenza di elaborazione, il che è opposto all'obiettivo originale del supporto di richieste HTTP in batch.
Che cosa è nello specifico obsoleto?
I seguenti metodi di richiesta batch per interagire con le API BigQuery non funzioneranno più:
- API REST
batchPath
specificata nel documento di rilevamento API - Classe
BatchRequest
della libreria client Java - Oggetto
Batch
della libreria client JavaScript - Oggetto
BatchRequest
della libreria client C# - Altre librerie client:
BatchRequest
class
Come faccio a eseguire la migrazione?
La maggior parte degli utenti BigQuery non utilizza richieste HTTP in batch. Se utilizzi ancora le richieste batch, ricorri ai seguenti esempi per sostituire le richieste HTTP in batch con richieste HTTP singole.
REST
Invia singole richieste HTTP come documentato nella sezione di riferimento dell'API BigQuery.
Non combinare le richieste in batch utilizzando il percorso /batch/v2/bigquery
.
JavaScript
Se utilizzi JavaScript, inizi con un blocco di codice simile al seguente:
// 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": "http://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 uno simile al seguente:
// 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, inizia 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 uno simile al seguente:
# 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 per gli esempi precedenti, sostituisci le chiamate BatchRequest
con singole richieste.
Ricevi assistenza per la migrazione
Per ricevere assistenza per la migrazione, puoi porre domande su Stack Overflow. I tecnici di Google monitorano e rispondono alle domande con il tag google-bigquery. Utilizza questo tag quando fai domande. Il nostro obiettivo è rispondere a tutte le domande in un periodo di tempo ragionevole.
Creazione di batch di richieste
Questo documento mostra come raggruppare le chiamate API per ridurre il numero di connessioni HTTP che il client deve effettuare.
Questo documento riguarda nello specifico l'esecuzione di una richiesta batch tramite l'invio di una richiesta HTTP. Se invece utilizzi una libreria client di Google per eseguire una richiesta batch, consulta la documentazione della libreria client.
Panoramica
Ogni connessione HTTP del client genera un determinato overhead. L'API BigQuery supporta il raggruppamento, per consentire al tuo client di inserire diverse chiamate API in una singola richiesta HTTP.
Esempi di situazioni in cui potresti voler utilizzare la creazione in batch:
- Hai appena iniziato a utilizzare l'API e hai molti dati da caricare.
- Un utente ha apportato modifiche ai dati mentre l'applicazione era offline (disconnessa da Internet), pertanto l'applicazione deve sincronizzare i propri 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 essere inviate alla stessa API di Google.
Puoi effettuare un massimo di 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 al batchPath
specificato nel documento di rilevamento API. Il percorso predefinito è /batch/api_name/api_version
. Questa sezione descrive dettagliatamente la sintassi batch; più avanti troverai un esempio.
Nota: un insieme di richieste n raggruppate insieme viene conteggiato ai fini del limite di utilizzo come richieste n, non come un'unica 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 contenuti multipart/mixed
. All'interno di quella richiesta HTTP principale, ogni 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 di parte servono solo a segnare l'inizio della parte e sono separate dalla richiesta nidificata. Dopo che il server ha annullato il wrapping della richiesta batch in richieste separate, le intestazioni delle parti vengono ignorate.
Il corpo di ogni parte è una richiesta HTTP completa, con verbo, URL, intestazioni e corpo specifici. 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, ad eccezione delle intestazioni Content-
come Content-Type
, si applicano a ogni richiesta del batch. Se specifichi una determinata intestazione HTTP sia nella richiesta esterna che in una singola chiamata, il valore di quest'ultima sostituisce il valore dell'intestazione della richiesta batch esterna. Le intestazioni di una singola chiamata si applicano solo a quella chiamata.
Ad esempio, se si fornisce un'intestazione Authorization per una chiamata specifica, l'intestazione si applica solo a quella chiamata. Se fornisci un'intestazione Authorization per la richiesta esterna, tale intestazione si applica a tutte le singole chiamate, a meno che non la sostituiscano con le intestazioni di autorizzazione proprie.
Quando il server riceve la richiesta in batch, applica i parametri di ricerca e le intestazioni della richiesta esterna (a seconda dei casi) 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 contenuto multipart/mixed
; ogni parte è la risposta a una delle richieste della richiesta in batch, nello stesso ordine delle richieste.
Come le parti della richiesta, ogni parte della risposta contiene una risposta HTTP completa, che include un codice di stato, intestazioni e corpo. E, come le altre parti della richiesta, ogni parte della risposta è preceduta da un'intestazione Content-Type
che segna l'inizio.
Se una determinata parte della richiesta aveva un'intestazione Content-ID
, la parte corrispondente della risposta avrà un'intestazione Content-ID
corrispondente, con il valore originale preceduto dalla stringa response-
, come mostrato nell'esempio seguente.
Nota: il server potrebbe effettuare le chiamate in qualsiasi ordine. Non fare affidamento sull'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 da sola, quindi attendi la risposta alla prima prima di inviare la seconda.
Esempio
L'esempio seguente mostra l'uso del batch con un'API demo generica (immaginaria) denominata API Farm. Tuttavia, gli stessi concetti si applicano 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:[email protected]> GET /farm/v1/animals/pony --batch_foobarbaz Content-Type: application/http Content-ID: <item2:[email protected]> 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:[email protected]> 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:[email protected]> 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:[email protected]> 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:[email protected]> HTTP/1.1 304 Not Modified ETag: "etag/animals" --batch_foobarbaz--