Migrazione delle code in modalità push a Cloud Tasks

Questa pagina descrive come eseguire la migrazione del codice della coda di push da code di attività a Cloud Tasks. Cloud Tasks è ora il modo preferito per lavorare con le code in modalità push di App Engine.

Panoramica

Cloud Tasks ti consente di accedere allo stesso servizio a cui accedi con l'API RPC Task Queues. Questo significa che non devi ricreare le code in modalità push e le attività push esistenti. Tuttavia, devi eseguire la migrazione del codice che crea o interagisce con le code in modalità push o le attività push per utilizzare l'API Cloud Tasks.

Puoi creare e interagire con code in modalità push e attività push utilizzando le API REST e RPC di Cloud Tasks, la libreria client di Cloud Tasks per Java, l'interfaccia a riga di comando di Google Cloud e Google Cloud Console. Questa pagina fornisce esempi che utilizzano l'interfaccia a riga di comando gcloud e la libreria client di Cloud Tasks per Java.

In Cloud Tasks, tutte le code funzionano come code in modalità push. Nel messaggio di questa guida e nella documentazione di Cloud Tasks, il termine coda è equivalente al termine coda push. Analogamente, il termine attività equivale al termine attività push.

Funzionalità attualmente non disponibili in Cloud Tasks

Le seguenti funzionalità non sono attualmente disponibili in Cloud Tasks:

  • Inserimento in coda delle attività nelle transazioni di Datastore
  • Utilizzo della libreria delle attività differite anziché un servizio worker
  • Utilizzo delle attività nelle applicazioni multi-tenant
  • Simulazione con il server di sviluppo locale
  • Aggiunta di attività in modo asincrono

Prezzi e quote

La migrazione delle code in modalità push a Cloud Tasks potrebbe influire sui prezzi e sulle quote della tua app.

Prezzi

Cloud Tasks ha prezzi specifici. Come per le code di attività, l'invio di richieste all'app App Engine con un'attività può comportare costi.

Quote

Le quote di Cloud Tasks sono diverse dalle quote delle code di attività. Come per le code di attività, l'invio di richieste all'app App Engine da Cloud Tasks potrebbe influire sulle quote per le richieste di App Engine.

Prima di eseguire la migrazione

Questa sezione illustra le operazioni da eseguire prima di eseguire la migrazione delle code in modalità push a Cloud Tasks.

Migrazione delle code in modalità pull

Utilizza la guida per la migrazione delle code in modalità pull per eseguire la migrazione delle code in modalità pull prima di utilizzare questa guida per eseguire la migrazione delle code in modalità push. La migrazione delle code in modalità pull dopo la migrazione delle code in modalità push non è consigliata perché l'utilizzo obbligatorio del file queue.yaml potrebbe causare comportamenti imprevisti di Cloud Tasks.

Protezione della configurazione delle code

Dopo aver iniziato il processo di migrazione a Cloud Tasks, la modifica del file queue.yaml può causare un comportamento imprevisto ed è sconsigliata. Proteggi la configurazione della coda dalle modifiche apportate dal file queue.yaml seguendo questa procedura.

  1. Configura l'interfaccia a riga di comando gcloud per omettere il tuo file queue.yaml nei deployment futuri.

    Aggiungi il file queue.yaml a un file .gcloudignore. Per verificare se hai già un file .gcloudignore, puoi eseguire il seguente comando nel tuo terminale dalla directory di primo livello della tua app. Questo comando restituirà il nome del file se esiste.

    ls -a | grep .gcloudignore

    Per ulteriori informazioni sui file .gcloudignore, leggi il riferimento .gcloudignore.

  2. Limita le autorizzazioni per il file queue.yaml.

    Segui le best practice descritte nella nostra guida su come proteggere la configurazione delle code.

  3. Ulteriori informazioni su Cloud Tasks e sul file queue.yaml (facoltativo).

    Quando utilizzi l'API Cloud Tasks per gestire la configurazione della coda, il deployment di un file queue.yaml sostituisce la configurazione impostata da Cloud Tasks, causando un comportamento imprevisto. Per ulteriori informazioni, consulta Confronto tra gestione delle code e code.yaml.

Abilitazione dell'API Cloud Tasks

Per abilitare l'API Cloud Tasks, fai clic su Abilita sull'API Cloud Tasks nella libreria API. Se vedi un pulsante Gestisci invece di Abilita, hai precedentemente abilitato l'API Cloud Tasks per il tuo progetto e non è necessario farlo di nuovo.

Autenticazione dell'app nell'API Cloud Tasks

Devi autenticare la tua app per l'API Cloud Tasks. Questa sezione tratta l'autenticazione per due diversi casi d'uso.

Per sviluppare o testare la tua app localmente, ti consigliamo di utilizzare un account di servizio. Per istruzioni su come configurare un account di servizio e collegarlo alla tua app, consulta Ottenere e fornire manualmente le credenziali dell'account di servizio.

Per eseguire il deployment dell'app su App Engine, non è necessario fornire nuove autenticazioni. Le credenziali predefinite dell'applicazione (ADC) corrispondono ai dettagli di autenticazione per le app di App Engine.

Download dell'interfaccia a riga di comando gcloud

Scarica e installa l'interfaccia a riga di comando gcloud per utilizzare l'interfaccia a riga di comando gcloud con l'API Cloud Tasks se non l'hai ancora installata. Esegui il seguente comando dal tuo terminale se hai già installato l'interfaccia a riga di comando gcloud.

gcloud components update

Importazione della libreria client per Java

Segui i passaggi riportati di seguito per utilizzare la libreria client di Cloud Tasks per Java con la tua app App Engine:

  1. Specifica la dipendenza della libreria client di Cloud Tasks nel file pom.xml:

    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-tasks</artifactId>
      <version>1.3.0</version>
    </dependency>
    
  2. Importa le dipendenze della libreria client di Cloud Tasks nei file responsabili della creazione e dell'accodamento delle attività:

    import com.google.cloud.tasks.v2.AppEngineHttpRequest;
    import com.google.cloud.tasks.v2.CloudTasksClient;
    import com.google.cloud.tasks.v2.HttpMethod;
    import com.google.cloud.tasks.v2.QueueName;
    import com.google.cloud.tasks.v2.Task;
    

Creazione e gestione delle code

Questa sezione descrive come creare e gestire le code utilizzando l'API Cloud Tasks.

Con Cloud Tasks, non utilizzi un file queue.yaml per creare o gestire le code. Utilizza, invece, l'API Cloud Tasks. L'utilizzo di un file queue.yaml e dell'API Cloud Tasks non è consigliato, ma potrebbe essere una parte inevitabile della migrazione da code di attività a Cloud Tasks, a seconda dell'app. Per ulteriori informazioni sulle best practice, leggi la pagina relativa all'utilizzo della gestione delle code e di coda.yaml.

Creazione di code

Leggi questa sezione se la tua app crea code in modo programmatico o se vuoi creare code aggiuntive dalla riga di comando.

In Cloud Tasks, i nomi di coda hanno il formato projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID. La porzione LOCATION_ID del nome coda corrisponde a un'area geografica Google Cloud. La parte QUEUE_ID del nome della coda equivale al campo name in coda delle attività. Il nome della coda viene generato durante la creazione della coda in base al progetto, all'area geografica e al QUEUE_ID specificati.

In generale, la località della coda (ossia l'area geografica) deve essere uguale all'area geografica dell'app. Le due eccezioni a questa regola sono per le app che utilizzano l'area geografica europe-west e le app che utilizzano l'area geografica us-central. In Cloud Tasks, queste aree geografiche sono chiamate rispettivamente europe-west1 e us-central1.

Puoi specificare la configurazione facoltativa della coda durante la creazione della coda, ma puoi farlo anche aggiornando la coda dopo la creazione.

Non è necessario ricreare le code esistenti. Puoi invece eseguire la migrazione del codice che interagisce con le code esistenti leggendo le sezioni pertinenti di questa guida.

Riutilizzo dei nomi delle code

Devi attendere 7 giorni dopo l'eliminazione di una coda per creare una coda con lo stesso ID coda nello stesso progetto e nella stessa località (ad esempio, area geografica).

L'esempio seguente crea due code utilizzando Cloud Tasks. La prima coda ha l'ID coda queue-blue ed è configurata per inviare tutte le attività alla versione v2 del servizio task-module a una velocità di 5/s. La seconda coda ha l'ID coda queue-red e invia attività con una frequenza pari a 1/s. Entrambi vengono creati nel progetto con ID progetto your-project-id nella località us-central1. Questo è l'equivalente di Cloud Tasks della creazione di code nelle code di attività.

gcloud

L'interfaccia a riga di comando gcloud deduce il progetto e la località dalla configurazione dell'interfaccia a riga di comando gcloud.

gcloud tasks queues create queue-blue \
--max-dispatches-per-second=5 \
--routing-override=service:task-module,version:v2
gcloud tasks queues create queue-red \
--max-dispatches-per-second=1

libreria client

import com.google.cloud.tasks.v2.AppEngineRouting;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;

public class CreateQueue {
  public static void createQueue(
      String projectId, String locationId, String queueBlueName, String queueRedName)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueBlueName = "queue-blue";
      // String queueRedName = "queue-red";

      LocationName parent = LocationName.of(projectId, locationId);

      Queue queueBlue =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueBlueName).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(5.0))
              .setAppEngineRoutingOverride(
                  AppEngineRouting.newBuilder().setVersion("v2").setService("task-module"))
              .build();

      Queue queueRed =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueRedName).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .build();

      Queue[] queues = new Queue[] {queueBlue, queueRed};
      for (Queue queue : queues) {
        Queue response = client.createQueue(parent, queue);
        System.out.println(response);
      }
    }
  }
}

Per ulteriori informazioni, leggi il riferimento a Cloud Tasks Creazione di una coda di Cloud Tasks.

Impostazione della frequenza di elaborazione della coda

La tabella seguente elenca i campi che differiscono dalle code di attività a Cloud Tasks.

Campo code di attività Campo Cloud Tasks Descrizione
rate max_dispatches_per_second La frequenza massima a cui le attività vengono inviate dalla coda
max_concurrent_requests max_concurrent_dispatches Il numero massimo di attività simultanee che possono essere inviate dalla coda
bucket_size max_burst_size

Cloud Tasks calcola una proprietà max_burst_size solo che limita la velocità di elaborazione delle attività nella coda in base al valore di max_dispatches_per_second. Questo campo consente alla coda di avere una frequenza elevata in modo che l'elaborazione inizi poco dopo l'accodamento di un'attività, ma limita comunque l'utilizzo delle risorse quando molte attività vengono accodate in un breve periodo di tempo.

Per le code di App Engine create o aggiornate utilizzando un file queue.xml/yaml, max_burst_size inizialmente equivale a bucket_size. Tuttavia, se la coda viene passata a un comando update utilizzando un'interfaccia di Cloud Tasks, max_burst_size verrà reimpostato in base al valore di max_dispatches_per_second, indipendentemente dal fatto che max_dispatches_per_second sia aggiornato.

total_storage_limit Ritirato in Cloud Tasks Attualmente Cloud Tasks non supporta l'impostazione di un limite di archiviazione personalizzato

Puoi impostare la frequenza di elaborazione della coda quando la crei o la aggiorni in seguito. L'esempio seguente utilizza Cloud Tasks per impostare la frequenza di elaborazione su una coda denominata queue-blue già creata. Se queue-blue è stato creato o configurato utilizzando un file queue.yaml, l'esempio riportato di seguito viene reimpostatomax_burst_size in base al valore max_dispatches_per_second di 20. Questo è l'equivalente di Cloud Tasks per l'impostazione della frequenza di elaborazione delle code in code di attività.

gcloud

gcloud tasks queues update queue-blue \
--max-dispatches-per-second=20 \
--max-concurrent-dispatches=10

libreria client

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;
import com.google.cloud.tasks.v2.UpdateQueueRequest;

public class UpdateQueue {
  public static void updateQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "queue-blue";

      LocationName parent = LocationName.of(projectId, locationId);

      Queue queueBlue =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, queueId).toString())
              .setRateLimits(
                  RateLimits.newBuilder()
                      .setMaxDispatchesPerSecond(20.0)
                      .setMaxConcurrentDispatches(10))
              .build();

      UpdateQueueRequest request = UpdateQueueRequest.newBuilder().setQueue(queueBlue).build();

      Queue response = client.updateQueue(request);
      System.out.println(response);
    }
  }
}

Per ulteriori informazioni, consulta la sezione Definire i limiti di frequenza.

Disabilitazione e ripresa delle code

Cloud Tasks utilizza il termine pause nello stesso modo in cui Task Queues utilizza il termine disable. La messa in pausa di una coda interrompe l'esecuzione delle attività nella coda finché la coda non viene ripresa. Tuttavia, puoi continuare ad aggiungere attività a una coda messa in pausa. Cloud Tasks utilizza il termine curriculum proprio come fa la coda delle attività.

L'esempio riportato di seguito mette in pausa una coda con ID coda queueName. Questo è l'equivalente di Cloud Tasks per la disattivazione delle code nelle code di attività.

gcloud

gcloud tasks queues pause queueName

libreria client

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class PauseQueue {
  public static void pauseQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.pauseQueue(queueName);
      System.out.println("Queue Paused.");
    }
  }
}

Per ulteriori informazioni, leggi il riferimento a Cloud Tasks Messa in pausa delle code.

Eliminazione delle code

Dopo aver eliminato una coda, devi attendere 7 giorni prima di creare una coda con lo stesso nome. Considera la possibilità di eliminare definitivamente tutte le attività da una coda e di riconfigurarla se non puoi attendere sette giorni.

L'esempio riportato di seguito elimina la coda con ID coda foo. Questa è l'equivalente di Cloud Tasks per l'eliminazione delle code nelle code di attività.

gcloud

gcloud tasks queues delete foo

libreria client

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class DeleteQueue {
  public static void deleteQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.deleteQueue(queueName);
      System.out.println("Queue Deleted.");
    }
  }
}

Per ulteriori informazioni, leggi il riferimento di Cloud Tasks Eliminazione di code.

Creazione e gestione delle attività

Questa sezione descrive come creare e gestire attività utilizzando l'API Cloud Tasks.

Creazione delle attività

La tabella seguente elenca i campi che differiscono dalle code di attività a Cloud Tasks.

Campo code di attività Campo Cloud Tasks Descrizione
NOVIT in Cloud Tasks app_engine_http_request Crea una richiesta che ha come target un servizio App Engine. Queste attività sono definite attività di App Engine.
method http_method Specifica il metodo della richiesta, ad esempio POST
url relative_uri Specifica il gestore di attività. Tieni presente la differenza nella lettera finale: i per Uniform Resource Identifier anziché l per Uniform Resource Locator.
target app_engine_routing (Facoltativo) Specifica service, version e instance di App Engine per un'attività App Engine. Se non impostato, vengono utilizzati il servizio, la versione e l'istanza predefiniti.

L'esempio seguente crea un'attività che indirizza al gestore /worker sul servizio App Engine predefinito. Questo è l'equivalente di Cloud Tasks per la creazione di attività nelle code di attività.

gcloud

gcloud tasks create-app-engine-task --queue=default \
--method=POST --relative-uri=/worker?key=key

libreria client

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.protobuf.ByteString;
import java.nio.charset.Charset;

public class CreateTask {
  public static void createTask(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      String key = "key";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      // Construct the task body.
      Task taskParam =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker?key=" + key)
                      .setHttpMethod(HttpMethod.GET)
                      .build())
              .build();

      Task taskPayload =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setBody(ByteString.copyFrom(key, Charset.defaultCharset()))
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Send create task request.
      Task[] tasks = new Task[] {taskParam, taskPayload};
      for (Task task : tasks) {
        Task response = client.createTask(queueName, task);
        System.out.println(response);
      }
    }
  }
}

Per ulteriori informazioni, leggi il riferimento a Cloud Tasks Creazione di attività di App Engine.

Specifica del servizio e del routing di destinazione

La specifica del servizio di destinazione, della versione e dell'istanza di App Engine per le attività di App Engine è facoltativa. Per impostazione predefinita, le attività di App Engine vengono instradate al servizio, alla versione e all'istanza predefiniti al momento del tentativo dell'attività.

Imposta la proprietà app_engine_routing dell'attività durante la creazione dell'attività per specificare un altro servizio App Engine, una versione o un'istanza per l'attività.

Per indirizzare tutte le attività su una coda specifica allo stesso servizio, versione e istanza di App Engine, puoi impostare la proprietà app_engine_routing_override in coda.

Per ulteriori informazioni, leggi il riferimento di Cloud Tasks Configurare il routing.

Passaggio di dati al gestore

Come con le code di attività, puoi trasferire i dati al gestore in due modi utilizzando Cloud Tasks. Puoi trasferire i dati come parametri di ricerca nell'URI relativo oppure nel corpo della richiesta utilizzando i metodi HTTP POST o PUT.

Cloud Tasks utilizza il termine body nello stesso modo in cui Task Queues utilizza il termine payload. In Cloud Tasks, il tipo di contenuto corpo predefinito è flusso di ottetto anziché testo normale. Puoi impostare il tipo di contenuti del corpo specificandolo nell'intestazione.

L'esempio seguente trasmette una chiave al gestore /worker in due modi diversi. È l'equivalente di Cloud Tasks per trasmettere dati al gestore nelle code di attività.

console

gcloud tasks create-app-engine-task --queue=default --method=GET  \
--relative-uri=/worker?key=blue --routing=service:worker
gcloud tasks create-app-engine-task --queue=default --method=POST \
--relative-uri=/worker --routing=service:worker \
--body-content="{'key': 'blue'}"

libreria client

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.protobuf.ByteString;
import java.nio.charset.Charset;

public class CreateTask {
  public static void createTask(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      String key = "key";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      // Construct the task body.
      Task taskParam =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker?key=" + key)
                      .setHttpMethod(HttpMethod.GET)
                      .build())
              .build();

      Task taskPayload =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setBody(ByteString.copyFrom(key, Charset.defaultCharset()))
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Send create task request.
      Task[] tasks = new Task[] {taskParam, taskPayload};
      for (Task task : tasks) {
        Task response = client.createTask(queueName, task);
        System.out.println(response);
      }
    }
  }
}

Assegnazione di nomi alle attività

Specificare il nome dell'attività è facoltativo, Se non specifichi il nome dell'attività, Cloud Tasks lo crea per te generando un ID attività e deducendo il progetto e la località, ad esempio l'area geografica, in base alla coda specificata durante la creazione dell'attività.

Il formato dei nomi delle attività è projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID/tasks/TASK_ID. La parte TASK_ID del nome dell'attività equivale al campo name code di attività.

Riutilizzo dei nomi delle attività

Devi attendere prima di riutilizzare il nome di un'attività. Il tempo di attesa prima di farlo varia a seconda che la coda di invio dell'attività sia stata creata in Cloud Tasks o in coda delle attività.

Per le attività inserite nelle code create utilizzando le code di attività, inclusa la coda predefinita, devi attendere circa 9 giorni dopo che l'attività originale è stata eliminata o eseguita. Per le attività in coda create con Cloud Tasks, è necessario attendere circa un'ora dopo l'eliminazione o l'esecuzione dell'attività originale.

L'esempio seguente crea un'attività con il criterio TASK_ID impostato su first-try e la aggiunge alla coda predefinita. Questa è l'equivalente di Cloud Tasks delle attività di denominazione nelle code di attività.

gcloud

L'interfaccia a riga di comando gcloud costruisce il nome dell'attività deducendo il progetto e la località dalla configurazione.

gcloud tasks create-app-engine-task first-try --queue=default \
--method=GET --relative-uri=/worker

libreria client

Con la libreria client, devi specificare il nome completo dell'attività se vuoi specificare TASK_ID. Il progetto e la località devono corrispondere al progetto e alla coda della coda a cui vengono aggiunte le attività.

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import com.google.cloud.tasks.v2.TaskName;

public class CreateTaskWithName {
  public static void createTaskWithName(
      String projectId, String locationId, String queueId, String taskId) throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "default";
      // String taskId = "first-try"

      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      Task.Builder taskBuilder =
          Task.newBuilder()
              .setName(TaskName.of(projectId, locationId, queueId, taskId).toString())
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/worker")
                      .setHttpMethod(HttpMethod.GET)
                      .build());

      // Send create task request.
      Task response = client.createTask(queueName, taskBuilder.build());
      System.out.println(response);
    }
  }
}

Nuovo tentativo delle attività non riuscite

Puoi impostare la ritenta delle attività sulle code in fase di creazione o aggiornando la coda. La tabella seguente elenca il campo code di attività e il corrispondente campo di Cloud Tasks.

Campo code di attività Campo Cloud Tasks
task_retry_limit max_attempts
task_age_limit max_retry_duration
min_backoff_seconds min_backoff
max_backoff_seconds max_backoff
max_doublings max_doublings

Parametri di ripetizione specifici per l'attività

I parametri di ripetizione specifici delle attività configurati in code di attività funzionano in Cloud Tasks, ma non puoi modificarli o impostarli in nuove attività. Per modificare i parametri di ripetizione per un'attività con parametri di ripetizione specifici, ricrea l'attività con una coda di Cloud Tasks contenente i parametri di ripetizione desiderati.

L'esempio seguente mostra vari scenari di ripetizione:

  • In fooqueue, le attività vengono ritentate fino a sette volte e per un massimo di due giorni dal primo tentativo di esecuzione. Una volta superati entrambi i limiti, l'operazione non riesce definitivamente.
  • In barqueue, App Engine tenta di riprovare le attività, aumentando l'intervallo in modo lineare tra ogni nuovo tentativo fino a raggiungere il backoff massimo e riprova a tempo indeterminato all'intervallo massimo (in modo che gli intervalli tra le richieste siano 10 s, 20s, 30s, ..., 190s, 200s, 200s, ...).
  • In bazqueue, l'intervallo tra i tentativi inizia a 10 s, poi raddoppia tre volte, poi aumenta in modo lineare e infine ritenta a tempo indeterminato all'intervallo massimo, quindi gli intervalli tra le richieste sono 10 s, 20 s, 40 s, 80 s, 160 s, 240 s, 300 sec, 300 sec).

Questo è l'equivalente di Cloud Tasks di riprovare attività nelle code di attività.

gcloud

Quando imposti le opzioni che specificano un numero di secondi, devi includere s dopo il numero intero (ad es. 200s, non 200).

gcloud tasks queues create fooqueue \
--max-attempts=7 \
--max-retry-duration=172800s  #2*60*60*24 seconds in 2 days
gcloud tasks queues create barqueue \
--min-backoff=10s \
--max-backoff=200s \
--max-doublings=0
gcloud tasks queues create bazqueue \
--min-backoff=10s \
--max-backoff=300s \
--max-doublings=3

libreria client

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.LocationName;
import com.google.cloud.tasks.v2.Queue;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.RateLimits;
import com.google.cloud.tasks.v2.RetryConfig;
import com.google.protobuf.Duration;

public class RetryTask {
  public static void retryTask(
      String projectId, String locationId, String fooqueue, String barqueue, String bazqueue)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String fooqueue = "fooqueue";
      // String barqueue = "barqueue";
      // String bazqueue = "bazqueue";

      LocationName parent = LocationName.of(projectId, locationId);

      Duration retryDuration = Duration.newBuilder().setSeconds(2 * 60 * 60 * 24).build();
      Duration min = Duration.newBuilder().setSeconds(10).build();
      Duration max1 = Duration.newBuilder().setSeconds(200).build();
      Duration max2 = Duration.newBuilder().setSeconds(300).build();

      Queue foo =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, fooqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder().setMaxAttempts(7).setMaxRetryDuration(retryDuration))
              .build();

      Queue bar =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, barqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder()
                      .setMinBackoff(min)
                      .setMaxBackoff(max1)
                      .setMaxDoublings(0))
              .build();

      Queue baz =
          Queue.newBuilder()
              .setName(QueueName.of(projectId, locationId, bazqueue).toString())
              .setRateLimits(RateLimits.newBuilder().setMaxDispatchesPerSecond(1.0))
              .setRetryConfig(
                  RetryConfig.newBuilder()
                      .setMinBackoff(min)
                      .setMaxBackoff(max2)
                      .setMaxDoublings(3))
              .build();

      Queue[] queues = new Queue[] {foo, bar, baz};
      for (Queue queue : queues) {
        Queue response = client.createQueue(parent, queue);
        System.out.println(response);
      }
    }
  }
}

Per ulteriori informazioni, leggi il riferimento di Cloud Tasks Impostare parametri per nuovi tentativi.

Eliminazione di attività da una coda

Quando elimini un'attività, devi attendere 9 giorni prima di crearne un'altra con lo stesso nome se si trovava in una coda creata utilizzando un file queue.yaml oppure 1 ora se si trovava in una coda creata utilizzando Cloud Tasks.

L'esempio seguente elimina l'attività con ID attività foo dalla coda con ID coda queue1. Questo è l'equivalente di Cloud Tasks per l'eliminazione delle attività nelle code di attività.

gcloud

Il progetto e la località dell'attività vengono dedotti dal progetto predefinito dell'interfaccia a riga di comando gcloud.

gcloud tasks delete foo --queue=queue1

libreria client

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.TaskName;

public class DeleteTask {
  public static void deleteTask(String projectId, String locationId, String queueId, String taskId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "queue1";
      // String taskId = "foo";

      // Construct the fully qualified queue name.
      String taskName = TaskName.of(projectId, locationId, queueId, taskId).toString();

      client.deleteTask(taskName);
      System.out.println("Task Deleted.");
    }
  }
}

Per ulteriori informazioni, leggi il riferimento a Cloud Tasks Eliminare un'attività da una coda.

Eliminazione definitiva delle attività

L'esempio seguente elimina definitivamente tutte le attività dalla coda con ID coda foo. È l'equivalente di Cloud Tasks per l'eliminazione delle attività nelle code di attività.

gcloud

Il progetto in coda e la località vengono dedotti dal progetto dell'interfaccia a riga di comando gcloud.

gcloud tasks queues purge foo

libreria client

import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.QueueName;

public class PurgeQueue {
  public static void purgeQueue(String projectId, String locationId, String queueId)
      throws Exception {
    try (CloudTasksClient client = CloudTasksClient.create()) {
      // TODO(developer): Uncomment these lines and replace with your values.
      // String projectId = "your-project-id";
      // String locationId = "us-central1";
      // String queueId = "foo";

      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, queueId).toString();

      client.purgeQueue(queueName);
      System.out.println("Queue Purged.");
    }
  }
}

Per ulteriori informazioni, leggi il riferimento a Cloud Tasks Puring all task from a queue.

Esempio di Cloud Tasks di Java 8

L'esempio seguente è una configurazione di base per creare una coda e accodare un'attività a Cloud Tasks. Si presume che lo sviluppatore abbia creato un file pom.xml per specificare la dipendenza Cloud Tasks come descritto nella sezione Importazione della libreria client. Questo è l'equivalente di Cloud Tasks di un esempio di coda di attività Java 8 in code di attività.

Il file responsabile della creazione e dell'accodamento dell'attività crea un'attività e la aggiunge alla coda predefinita utilizzando la libreria client di Cloud Tasks per Java:

import com.google.cloud.tasks.v2.AppEngineHttpRequest;
import com.google.cloud.tasks.v2.CloudTasksClient;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.cloud.tasks.v2.QueueName;
import com.google.cloud.tasks.v2.Task;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "TaskEnqueue",
    description = "Enqueue a task targeted at endpoint '/cloudtasks/worker'",
    urlPatterns = "/cloudtasks/enqueue")
public class Enqueue extends HttpServlet {

  // TODO(developer): Replace these variables before running the sample.
  static final String projectId = "my-project-id";
  static final String locationId = "us-central1";

  // Function creates Cloud Tasks from form submissions.
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String key = request.getParameter("key");

    try (CloudTasksClient client = CloudTasksClient.create()) {
      // Construct the fully qualified queue name.
      String queueName = QueueName.of(projectId, locationId, "default").toString();

      // Construct the task body.
      Task task =
          Task.newBuilder()
              .setAppEngineHttpRequest(
                  AppEngineHttpRequest.newBuilder()
                      .setRelativeUri("/cloudtasks/worker?key=" + key)
                      .setHttpMethod(HttpMethod.POST)
                      .build())
              .build();

      // Add the task to the default queue.
      Task taskResponse = client.createTask(queueName, task);
      System.out.println("Task created: " + taskResponse.getName());
    }

    response.sendRedirect("/");
  }
}

Il file che definisce il worker gestisce l'attività:

import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(
    name = "TaskWorker",
    description = "Endpoint to process Cloud Task requests",
    urlPatterns = "/cloudtasks/worker"
)
public class Worker extends HttpServlet {

  private static final Logger log = Logger.getLogger(Worker.class.getName());

  // Worker function to process POST requests from Cloud Tasks targeted at the
  // '/cloudtasks/worker' endpoint.
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String key = request.getParameter("key");
    log.info("Worker is processing " + key);
  }
}

Passaggi successivi