Memorizzare le richieste HTTP nel buffer con Cloud Tasks

1. Introduzione

c6ac6ed05292f13e.png

Cloud Tasks è un servizio di gestione delle code completamente gestito per gestire l'esecuzione, l'invio e la consegna di un numero elevato di attività.

Cloud Tasks ti consente di separare le parti di lavoro, chiamate attività, che possono essere eseguite in modo indipendente (ad es. un'attività per aggiornare una voce di database), al di fuori del flusso principale dell'applicazione, e di inviarle per essere elaborate in modo asincrono utilizzando i gestori che crei.

L'attività di cui è stato eseguito l'offload viene aggiunta a una coda, che la conserva finché non viene eseguita correttamente o non viene segnalato un errore. In base alla configurazione, la coda può fungere anche da controllo del flusso di distribuzione. Crei e configuri la coda, che viene poi gestita dal servizio Cloud Tasks. Una volta aggiunte le attività, la coda le distribuisce 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à indirizzate a qualsiasi servizio HTTP in esecuzione su Compute Engine, Google Kubernetes Engine, Cloud Run, Cloud Functions o sistemi on-premise mediante l'autenticazione OAuth/OIDC standard di settore.
  • Duplicazione delle attività: le attività aggiunte più volte verranno inviate una sola volta.
  • Consegna garantita: è garantita la consegna delle attività almeno una volta e la maggior parte delle attività viene consegnata esattamente una volta.
  • Controlli di frequenza e ripetizione dei 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 prima a creare e utilizzare una coda Cloud Tasks normale per le attività target HTTP. Poi imparerai a utilizzare l'override dell'URI HTTP a livello di coda e la nuova API BufferTask per memorizzare più facilmente le richieste HTTP nel buffer con Cloud Tasks.

Obiettivi didattici

  • Come creare attività target HTTP.
  • Come creare attività target HTTP con la nuova sostituzione dell'URI HTTP a livello di coda.
  • Come modificare le attività in attesa con la nuova sostituzione dell'URI HTTP a livello di coda.
  • Come memorizzare più facilmente nel buffer le richieste HTTP con la nuova API BufferTask.

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  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 del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi sempre aggiornarlo.
  • L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti piace, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimane per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. Completare questo codelab non costa molto, se non nulla. Per arrestare le risorse ed evitare addebiti oltre a quelli previsti in questo tutorial, puoi eliminare le risorse che hai creato o il progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere gestito da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Nella console Google Cloud, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:

55efc1aaa7a4d3ad.png

Bastano pochi istanti per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere un risultato simile a questo:

7ffe5cbb04455448.png

Questa macchina virtuale è caricata con tutti gli strumenti per sviluppatori di cui avrai bisogno. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Tutto il lavoro in questo codelab può essere svolto all'interno di un browser. Non devi installare nulla.

3. Crea una coda normale per le attività target HTTP

In questo primo passaggio, imparerai a creare una coda Cloud Tasks normale e ad aggiungervi attività HTTP per indirizzare un servizio Cloud Run.

d4f09a342c8eab.png

Che cosa sono le attività target HTTP?

Le attività target HTTP possono essere indirizzate a 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 siano abilitate le API richieste:

gcloud services enable \
  cloudtasks.googleapis.com \
  run.googleapis.com

Esegui il deployment di un servizio Cloud Run che fungerà da target 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 Cloud Tasks normale:

QUEUE1=http-queue
LOCATION=us-central1

gcloud tasks queues create $QUEUE1 --location=$LOCATION

Metti in pausa temporaneamente la coda per osservare le attività HTTP man mano che vengono create:

gcloud tasks queues pause $QUEUE1 --location=$LOCATION

4. Crea e testa un'attività HTTP

In questo passaggio creerai un'attività HTTP per scegliere come target la coda che hai creato 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 consultare l'Program.cs per un esempio in C# in cui una richiesta HTTP viene inserita in un Task e in un 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 eseguirlo 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à viene creata, ma non viene ancora eseguita perché 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. Creare una coda con una configurazione di routing

In questo passaggio, imparerai a creare una coda Cloud Tasks con una configurazione di routing per aggiungere un override URI HTTP utilizzando la funzionalità Configurazione di routing delle attività a livello di coda. Aggiungerai quindi attività HTTP per indirizzare il primo servizio Cloud Run e osserverai che la configurazione di routing esegue l'override dell'URI per indirizzare le attività al secondo servizio Cloud Run.

5d1ec61a933f77.png

Che cos'è la configurazione dell'indirizzamento 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à nuove e in attesa. Ciò consente di creare più facilmente le attività, in quanto la destinazione HTTP non deve essere impostata a livello di attività e il controllo viene trasferito al service provider, che può impostare la destinazione di tutte le attività in una coda (ad es. instradare il traffico a un backend diverso se il backend originale non è disponibile).

La seguente configurazione può essere impostata a livello di coda:

  • Intestazioni: le intestazioni a livello di coda, se specificate a questo livello, verranno inserite o aggiornate per tutte le attività nella coda.
  • Metodo HTTP: il metodo HTTP, se specificato a livello di coda, sostituirà il metodo HTTP per tutte le attività nella coda.
  • URI di destinazione: host, percorso, query, porta e schema (HTTP o HTTPS) possono essere sostituiti singolarmente.
  • Autorizzazione: la configurazione OIDC/OAuth 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 utilizzo futuro:

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

Crea una coda con una configurazione di routing con override dell'URI HTTP per il 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. L'host URI originale di qualsiasi attività HTTP aggiunta alla coda verrà sostituito. 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 in pausa temporaneamente la coda per 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 relativo URI viene sostituito dalla coda in modo che punti 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 attesa con la configurazione di routing

Puoi anche utilizzare la configurazione di routing per modificare l'URI HTTP di tutte le attività in attesa in una coda. Questa funzionalità è utile se il servizio di backend non funziona e vuoi indirizzare rapidamente il traffico 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 con 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 In attesa perché la coda è in pausa.

Ora aggiorna l'override dell'URI HTTP in modo che punti al primo servizio. In questo modo, l'host dell'attività in attesa verrà sostituito 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 HTTP GET 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

In genere, le attività vengono create utilizzando l'API Tasks da gcloud o dalle librerie client Tasks. In questo modo, le applicazioni devono eseguire il wrapping delle richieste HTTP in attività utilizzando le librerie client e viene creata una dipendenza tra le applicazioni e le librerie client Tasks.

In questo passaggio, vedrai come sfruttare l'override dell'URI HTTP a livello di coda e la nuova API BufferTask per creare più facilmente attività di destinazione HTTP semplicemente inviando una richiesta HTTP. Qualsiasi applicazione in grado di inviare richieste HTTP ora può creare attività di destinazione HTTP.

b1606516297fc4b6.png

Che cos'è l'API BufferTask?

L'API CreateTask è il vecchio modo di creare attività e richiede al client di inviare un oggetto Task 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), consentendo di inviare semplicemente un messaggio o il corpo della richiesta all'API Buffer.

Ciò consente una più facile integrazione con i servizi, in quanto Cloud Tasks ora può essere implementato davanti al tuo servizio senza richiedere modifiche al codice lato client. Qualsiasi richiesta HTTP arbitraria inviata all'API BufferTask verrà incapsulata come oggetto Task e consegnata alla destinazione impostata a livello di coda.

Per utilizzare l'API BufferTask, la coda deve avere impostata la configurazione dell'URI di destinazione. In altre parole, la funzionalità Configurazione del routing a livello di coda è un prerequisito per l'utilizzo dell'API BufferTask.

Crea una coda Cloud Tasks con configurazione di routing

Crea una coda con una configurazione di routing che punta 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 in pausa temporaneamente la coda per osservare le attività HTTP man mano che vengono create:

gcloud tasks queues pause $QUEUE3 --location=$LOCATION

9. Memorizzare nel buffer le richieste HTTP con l'API BufferTask

In questo passaggio, memorizzerai nel buffer semplici richieste HTTP GET o POST con l'API BufferTask. Cloud Tasks eseguirà il wrapping di queste richieste HTTP in attività HTTP con le impostazioni di configurazione del routing predefinite della coda.

Innanzitutto, accedi per ottenere un token di accesso e impostare 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 come si tratti di una semplice richiesta HTTP GET 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 l'Program.cs per un esempio in C# in cui una richiesta HTTP GET viene inviata direttamente all'API BufferTask senza doverla racchiudere in un Task o senza la necessità 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 nel seguente modo:

dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN

L'API BufferTask si occupa di creare un'attività dalle richieste HTTP e aggiunge l'URL dalle impostazioni di configurazione del routing della coda per l'URI.

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

Congratulazioni, hai completato il codelab.

Come follow-up, 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 possono aiutarti a creare facilmente una coda buffer tra i servizi.

Pulizia (facoltativa)

Per evitare addebiti, è consigliabile eseguire la pulizia delle risorse.

Se non hai bisogno del progetto, 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à target HTTP con la nuova sostituzione dell'URI HTTP a livello di coda.
  • Come modificare le attività in attesa con la nuova sostituzione dell'URI HTTP a livello di coda.
  • Come memorizzare più facilmente nel buffer le richieste HTTP con la nuova API BufferTask.