Memorizzare le richieste HTTP nel buffer con Cloud Tasks

1. Introduzione

c6ac6ed05292f13e.png

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.

d59ffe8d34138c88.png

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

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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:

55efc1aaa7a4d3ad.png

Dovrebbe richiedere solo qualche istante per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere una schermata simile al seguente:

7ffe5cbb04455448.png

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.

d4f09a342c8eab.png

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.

5d1ec61a933f77.png

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.

b1606516297fc4b6.png

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.