1. Introduzione
Cloud Tasks è un servizio di accodamento completamente gestito per la gestione dell'esecuzione, dell'invio e della consegna di un numero elevato di attività.
Cloud Tasks ti consente di separare le attività, chiamate attività, che possono essere eseguite in modo indipendente (ad es. un'attività di aggiornamento di una voce di database) al di fuori del flusso dell'applicazione principale e di inviarli per l'elaborazione in modo asincrono utilizzando gestori da te creati.
L'attività scaricata viene aggiunta a una coda, che mantiene l'attività finché non viene eseguita correttamente o non viene riscontrato un errore. In base alla configurazione, la coda può anche fungere da controllo del flusso di invio. Puoi creare e configurare la coda che viene quindi gestita dal servizio Cloud Tasks. Una volta aggiunte le attività, la coda invia le attività e si assicura che i worker le elaborino in modo affidabile.
Ecco alcune delle funzionalità principali di Cloud Tasks:
- Destinazioni HTTP: aggiungi in modo sicuro attività che hanno come target qualsiasi servizio HTTP in esecuzione su Compute Engine, Google Kubernetes Engine, Cloud Run, Cloud Functions o sistemi on-premise utilizzando l'autenticazione OAuth/OIDC standard di settore.
- Deduplicazione attività: le attività aggiunte più volte verranno inviate una sola volta.
- Consegna garantita: è garantito che le attività vengano consegnate almeno una volta, mentre la maggior parte delle attività viene consegnata esattamente una volta.
- Controlli relativi alla frequenza e ai nuovi tentativi: controlla l'esecuzione impostando la frequenza di invio delle attività, il numero massimo di tentativi e il tempo minimo di attesa tra un tentativo e l'altro.
- Pianificazione futura: controlla l'ora in cui viene eseguita un'attività.
In questo codelab, imparerai innanzitutto a creare e utilizzare una coda di Cloud Tasks standard per le attività HTTP di destinazione. Imparerai quindi a utilizzare l'override dell'URI HTTP a livello di coda e la nuova API BufferTask per eseguire più facilmente il buffering delle richieste HTTP con Cloud Tasks.
Obiettivi didattici
- Come creare attività target HTTP
- Come creare attività di destinazione HTTP con la nuova sostituzione dell'URI HTTP a livello di coda.
- Come modificare le attività in sospeso con la nuova sostituzione dell'URI HTTP a livello di coda.
- Come effettuare il buffering più facilmente delle richieste HTTP con la nuova API BufferTask.
2. Configurazione e requisiti
Configurazione dell'ambiente autogestito
- Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.
- Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarla.
- L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento al tuo ID progetto (in genere identificato come
PROJECT_ID
). Se l'ID generato non ti soddisfa, potresti generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto. - Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
- Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. L'esecuzione di questo codelab non ha alcun costo. Per arrestare le risorse ed evitare di incorrere in fatturazione dopo questo tutorial, puoi eliminare le risorse che hai creato o eliminare il progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.
Avvia Cloud Shell
Anche se Google Cloud può essere utilizzato da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.
Dalla console Google Cloud, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:
Dovrebbe richiedere solo qualche istante per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere una schermata simile al seguente:
Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Tutto il lavoro in questo codelab può essere svolto all'interno di un browser. Non occorre installare nulla.
3. Crea una coda normale per le attività di destinazione HTTP
In questo primo passaggio, imparerai a creare una coda di Cloud Tasks normale e ad aggiungere attività HTTP per scegliere come target un servizio Cloud Run.
Che cosa sono le attività target HTTP?
Le attività di destinazione HTTP possono scegliere come target qualsiasi servizio HTTP in esecuzione su Compute Engine, Google Kubernetes Engine, Cloud Run, Cloud Functions o sistemi on-premise in modo sicuro utilizzando l'autenticazione OAuth/OIDC standard di settore.
Esegui il deployment di un servizio Cloud Run
Innanzitutto, assicurati che le API richieste siano abilitate:
gcloud services enable \ cloudtasks.googleapis.com \ run.googleapis.com
Esegui il deployment di un servizio Cloud Run che fungerà da destinazione delle attività HTTP:
SERVICE1=hello1 REGION=us-central1 gcloud run deploy $SERVICE1 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
Crea una coda di Cloud Tasks
Crea una coda di Cloud Tasks normale:
QUEUE1=http-queue LOCATION=us-central1 gcloud tasks queues create $QUEUE1 --location=$LOCATION
Metti temporaneamente in pausa la coda per poter osservare le attività HTTP man mano che vengono create:
gcloud tasks queues pause $QUEUE1 --location=$LOCATION
4. Creare e testare un'attività HTTP
In questo passaggio creerai un'attività HTTP per scegliere come target la coda creata in precedenza.
Crea un'attività HTTP
Puoi creare attività HTTP utilizzando gcloud
:
gcloud tasks create-http-task \ --queue=$QUEUE1 \ --location=$LOCATION \ --url=$SERVICE1_URL \ --method=GET
(Facoltativo) Puoi anche creare un'attività HTTP con le librerie client. Ad esempio, puoi controllare il Program.cs
per un esempio C# in cui una richiesta HTTP viene sottoposta a wrapping in Task
e TaskRequest
prima di essere inviata a Cloud Tasks con un CloudTasksClient
:
var taskRequest = new CreateTaskRequest { Parent = new QueueName(projectId, location, queue).ToString(), Task = new Task { HttpRequest = new HttpRequest { HttpMethod = HttpMethod.Get, Url = url } } }; var client = CloudTasksClient.Create(); var response = client.CreateTask(taskRequest);
Puoi eseguirla come segue per creare e aggiungere l'attività alla coda:
dotnet run $PROJECT_ID $LOCATION $QUEUE1 $SERVICE1_URL
Testa l'attività HTTP
A questo punto l'attività è stata creata, ma non è ancora stata eseguita, poiché la coda è in pausa. Puoi verificarlo elencando le code:
gcloud tasks queues list --location=$LOCATION
Dovresti vedere la coda nello stato PAUSED
:
QUEUE_NAME STATE http-queue PAUSED
Riprendi la coda:
gcloud tasks queues resume $QUEUE --location=$LOCATION
Controlla i log del servizio Cloud Run:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1
Dovresti vedere che il servizio Cloud Run ha ricevuto una richiesta HTTP GET da Cloud Tasks:
httpRequest: latency: 0.227597158s protocol: HTTP/1.1 remoteIp: 35.243.23.192 requestMethod: GET requestSize: '415' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks
5. Crea una coda con una configurazione di routing
In questo passaggio, imparerai a creare una coda di Cloud Tasks con una configurazione di routing per aggiungere un override dell'URI HTTP utilizzando la funzionalità di configurazione del routing delle attività a livello di coda. Aggiungerai quindi attività HTTP per scegliere come target il primo servizio Cloud Run e osserverai che la configurazione di routing esegue l'override dell'URI per instradare le attività al secondo servizio Cloud Run.
Che cos'è la configurazione del routing delle attività a livello di coda?
La configurazione del routing delle attività a livello di coda modifica il routing delle attività HTTP per l'intera coda per tutte le attività in sospeso e nuove. In questo modo è più semplice creare le attività perché non è necessario impostare la destinazione HTTP a livello dell'attività e il fornitore di servizi dispone di un maggiore controllo, in quanto è in grado di impostare la destinazione di tutte le attività in una coda (ad esempio, instradare il traffico a un backend diverso se quello originale non è attivo).
È possibile impostare la seguente configurazione a livello di coda:
- Intestazioni: se specificate a livello di coda, le intestazioni a livello di coda eseguono l'upsert delle intestazioni per tutte le attività in coda.
- Metodo HTTP. Se specificato a livello di coda, il metodo HTTP sostituisce il metodo HTTP per tutte le attività in coda.
- URI di destinazione: host, percorso, query, porta, schema (HTTP o HTTPS) possono essere sostituiti singolarmente.
- Autorizzazione: la configurazione OIDC/OAuth quando specificata a livello di coda sostituirà la configurazione OIDC/OAuth a livello di attività.
Esegui il deployment di un secondo servizio Cloud Run
Esegui il deployment di un secondo servizio Cloud Run che fungerà da destinazione dell'override dell'URI HTTP in un secondo momento:
SERVICE2=hello2 REGION=us-central1 gcloud run deploy $SERVICE2 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
Salva l'host dell'URL del servizio per un secondo momento:
SERVICE2_URL=$(gcloud run services describe $SERVICE2 --region $REGION --format 'value(status.url)') SERVICE2_HOST=$(echo $SERVICE2_URL | sed 's,http[s]*://,,g')
Crea una coda di Cloud Tasks con una configurazione di routing
Creare una coda con una configurazione di routing con override dell'URI HTTP al secondo servizio Cloud Run.
QUEUE2=http-queue-uri-override gcloud beta tasks queues create $QUEUE2 \ --http-uri-override=host:$SERVICE2_HOST \ --location=$LOCATION
Tieni presente che l'override dell'URI si riferisce al secondo servizio Cloud Run. Per qualsiasi attività HTTP aggiunta alla coda verrà eseguito l'override dell'host URI originale. Puoi visualizzare la configurazione della coda:
gcloud beta tasks queues describe $QUEUE2 --location=$LOCATION
Dovresti vedere che httpTarget
ha un uriOverride
che punta all'host del secondo servizio:
httpTarget: uriOverride: host: hello2-idcwffc3yq-uc.a.run.app pathOverride: {} queryOverride: {} ...
Metti temporaneamente in pausa la coda per poter osservare le attività HTTP man mano che vengono create:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
6. Crea e testa un'attività HTTP per la coda con la configurazione di routing
In questo passaggio creerai un'attività HTTP per scegliere come target il primo servizio e osserverai che il suo URI viene sostituito dalla coda per puntare al secondo servizio.
Crea un'attività HTTP
Crea un'attività HTTP con l'URL del primo servizio:
gcloud tasks create-http-task \ --queue=$QUEUE2 \ --location=$LOCATION \ --url=$SERVICE1_URL \ --method=GET
Testa l'attività HTTP
Riprendi la coda:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
Dovresti vedere che il secondo servizio Cloud Run (non il primo) ha ricevuto una richiesta HTTP GET da Cloud Tasks a causa dell'override:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE2" --limit 1
--- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello2-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
7. Modifica le attività in sospeso con la configurazione del routing
Puoi anche utilizzare la configurazione del routing per modificare l'URI HTTP di tutte le attività in sospeso in una coda. Ciò è utile se il servizio di backend non è disponibile e vuoi eseguire rapidamente il routing a un altro servizio. Vediamo come funziona in questo passaggio.
Metti di nuovo in pausa la coda:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
Crea un'attività HTTP utilizzando google.com
come URL dell'attività:
gcloud tasks create-http-task \ --queue=$QUEUE2 \ --location=$LOCATION \ --url=https://www.google.com \ --method=GET
L'attività è in stato di attesa perché la coda è in pausa.
Ora aggiorna l'override dell'URI HTTP in modo che punti al primo servizio. Questa operazione sostituirà l'host dell'attività in sospeso da google.com
all'host del primo servizio:
SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') gcloud beta tasks queues update $QUEUE2 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
Riprendi la coda:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
Dovresti vedere che il primo servizio Cloud Run ha ricevuto una richiesta GET HTTP da Cloud Tasks a causa dell'override (anziché google.com
):
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1 --- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
8. Crea una coda per l'API BufferTask
Di solito, puoi creare le attività utilizzando l'API Tasks dalle librerie client di gcloud
o di Tasks. In questo modo le applicazioni vengono gravate per aggregare le richieste HTTP in Tasks utilizzando le librerie client, oltre a creare una dipendenza tra le applicazioni e le librerie client di Tasks.
In questo passaggio scoprirai come sfruttare l'override dell'URI HTTP a livello di coda e la nuova API BufferTask per creare più facilmente attività HTTP di destinazione, semplicemente inviando una richiesta HTTP. Qualsiasi applicazione in grado di inviare richieste HTTP può creare attività di destinazione HTTP.
Che cos'è l'API BufferTask?
L'API CreateTask è il vecchio metodo di creazione di Tasks e richiede che il client invii un oggetto Tasks all'API con tutti i campi obbligatori impostati.
L'API BufferTask è una nuova funzionalità che consente agli utenti di creare un'attività HTTP senza dover fornire alcuna configurazione dell'attività (URL HTTP, intestazioni, autorizzazione), permettendoti di inviare semplicemente un messaggio o il corpo della richiesta all'API Buffer.
Ciò semplifica l'integrazione con i servizi, poiché ora è possibile eseguire il deployment di Cloud Tasks a livello di servizio senza dover apportare modifiche al codice sul lato client. Qualsiasi richiesta HTTP arbitraria inviata all'API BufferTask viene sottoposta a wrapping come oggetto Tasks e inviata alla destinazione impostata a livello di coda.
Per utilizzare l'API BufferTask, nella coda deve essere impostata la configurazione dell'URI di destinazione. In altre parole, la funzionalità di configurazione del routing a livello di coda è un prerequisito per l'utilizzo dell'API BufferTask.
Crea una coda di Cloud Tasks con configurazione del routing
Crea una coda con una configurazione di routing che punti al primo servizio di cui abbiamo eseguito il deployment nel passaggio precedente:
SERVICE1=hello1 SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') QUEUE3=http-queue-uri-override-buffer gcloud beta tasks queues create $QUEUE3 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
Metti temporaneamente in pausa la coda per poter osservare le attività HTTP man mano che vengono create:
gcloud tasks queues pause $QUEUE3 --location=$LOCATION
9. Memorizzare le richieste HTTP nel buffer con l'API BufferTask
In questo passaggio, eseguirai il buffer delle richieste HTTP GET o POST semplici con l'API BufferTask. Cloud Tasks aggregherà queste richieste HTTP in attività HTTP con le impostazioni di configurazione del routing predefinite della coda.
Innanzitutto, accedi per ricevere un token di accesso e imposta alcune variabili:
gcloud auth application-default login ACCESS_TOKEN=$(gcloud auth application-default print-access-token) PROJECT_ID=$(gcloud config get-value project) TASKS_QUEUES_API="https://cloudtasks.googleapis.com/v2beta3/projects/$PROJECT_ID/locations/$LOCATION/queues"
Crea un'attività HTTP
Crea un'attività HTTP con l'API BufferTask. Nota che si tratta di una semplice richiesta GET HTTP senza la necessità di creare un'attività:
curl -X GET "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN"
Crea un'altra attività HTTP con HTTP POST e un corpo:
curl -X POST "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d "{'message': 'Hello World'}"
(Facoltativo) Puoi anche creare un'attività HTTP con le librerie client. Ad esempio, puoi consultare Program.cs
per un esempio C# in cui una richiesta GET HTTP viene inviata direttamente all'API BufferTask senza doverla eseguire il wrapping in un Task
o avere bisogno della libreria client per Cloud Tasks:
var BufferTaskApiUrl = $"https://cloudtasks.googleapis.com/v2beta3/projects/{ProjectId}/locations/{Location}/queues/{Queue}/tasks:buffer"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Authorization", $"Bearer {AccessToken}"); var response = await client.GetAsync(BufferTaskApiUrl); var content = await response.Content.ReadAsStringAsync(); Console.WriteLine($"Response: {content}"); }
Puoi eseguirlo come segue:
dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN
L'API BufferTask si occupa di creare un'attività dalle richieste HTTP e aggiunge l'URL per l'URI dalle impostazioni di configurazione del routing della coda.
Testa l'attività HTTP
Riprendi la coda:
gcloud tasks queues resume $QUEUE3 --location=$LOCATION
Dovresti vedere che il servizio Cloud Run ha ricevuto richieste HTTP GET e POST da Cloud Tasks:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 4
--- httpRequest: latency: 0.002279292s protocol: HTTP/1.1 remoteIp: 35.243.23.42 requestMethod: POST requestSize: '777' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5450' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks ... httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
10. Complimenti
Complimenti, hai completato il codelab.
In seguito, puoi provare Cloud Tasks come buffer tra Pub/Sub e Cloud Run per vedere un esempio reale di come queste nuove funzionalità di Cloud Tasks possano aiutare a creare facilmente una coda di buffer tra i servizi.
Pulizia (facoltativo)
Per evitare addebiti, ti consigliamo di eseguire la pulizia delle risorse.
Se il progetto non ti serve, puoi semplicemente eliminarlo:
gcloud projects delete $PROJECT_ID
Se hai bisogno del progetto, puoi eliminare le risorse singolarmente.
Elimina i servizi Cloud Run:
gcloud run services delete $SERVICE1 --region $REGION gcloud run services delete $SERVICE2 --region $REGION
Elimina le code di Cloud Tasks:
gcloud tasks queues delete $QUEUE1 --location=$LOCATION gcloud tasks queues delete $QUEUE2 --location=$LOCATION gcloud tasks queues delete $QUEUE3 --location=$LOCATION
Argomenti trattati
- Come creare attività target HTTP
- Come creare attività di destinazione HTTP con la nuova sostituzione dell'URI HTTP a livello di coda.
- Come modificare le attività in sospeso con la nuova sostituzione dell'URI HTTP a livello di coda.
- Come effettuare il buffering più facilmente delle richieste HTTP con la nuova API BufferTask.