1. Introduction
Cloud Tasks est un service de mise en file d'attente entièrement géré permettant de gérer l'exécution, l'envoi et la distribution d'un grand nombre de tâches.
Cloud Tasks vous permet de séparer des éléments de travail, appelés tâches, pouvant être exécutés indépendamment (par exemple, une tâche de mise à jour d'une entrée de base de données) en dehors de votre flux d'application principal, et de les envoyer pour traitement, de manière asynchrone, à l'aide de gestionnaires que vous créez.
La tâche déchargée est ajoutée à une file d'attente, qui la conserve jusqu'à ce qu'elle soit correctement exécutée ou qu'elle échoue. Selon la configuration, la file d'attente peut également servir de contrôle de flux de distribution. Vous créez et configurez la file d'attente, qui est ensuite gérée par le service Cloud Tasks. Une fois les tâches ajoutées, la file d'attente les distribue et s'assure que les nœuds de calcul les traitent de manière fiable.
Voici quelques-unes des principales fonctionnalités de Cloud Tasks:
- Cibles HTTP:ajoutez des tâches ciblant n'importe quel service HTTP exécuté sur Compute Engine, Google Kubernetes Engine, Cloud Run, Cloud Functions ou des systèmes sur site de manière sécurisée à l'aide de l'authentification OAuth/OIDC standard dans l'industrie.
- Déduplication de tâches: les tâches ajoutées plusieurs fois ne sont envoyées qu'une seule fois.
- Diffusion garantie: les tâches sont livrées au moins une fois, et la plupart des tâches sont distribuées exactement une fois.
- Contrôles de fréquence et de nouvelles tentatives:contrôlez l'exécution en définissant la fréquence d'envoi des tâches, le nombre maximal de tentatives et la durée minimale d'attente entre les tentatives.
- Planification future:contrôlez l'heure d'exécution d'une tâche.
Dans cet atelier de programmation, vous allez d'abord apprendre à créer et à utiliser une file d'attente Cloud Tasks standard pour des tâches HTTP cibles. Ensuite, vous apprendrez à utiliser le remplacement d'URI HTTP au niveau de la file d'attente et la nouvelle API BufferTask pour mettre plus facilement en mémoire tampon les requêtes HTTP avec Cloud Tasks.
Points abordés
- Créer des tâches HTTP Target
- Créer des tâches HTTP cibles avec le nouveau remplacement d'URI HTTP au niveau de la file d'attente
- Modifier les tâches en attente avec le nouveau remplacement d'URI HTTP au niveau de la file d'attente
- Découvrez comment mettre plus facilement en mémoire tampon les requêtes HTTP avec la nouvelle API BufferTask.
2. Préparation
Configuration de l'environnement d'auto-formation
- Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)
- Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pourrez toujours le modifier.
- L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par
PROJECT_ID
). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet. - Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
- Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.
Démarrer Cloud Shell
Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Google Cloud Shell pour cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.
Dans la console Google Cloud, cliquez sur l'icône Cloud Shell dans la barre d'outils supérieure :
Le provisionnement et la connexion à l'environnement prennent quelques instants seulement. Une fois l'opération terminée, le résultat devrait ressembler à ceci :
Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez effectuer toutes les tâches de cet atelier de programmation dans un navigateur. Vous n'avez rien à installer.
3. Créer une file d'attente standard pour des tâches HTTP cibles
Dans cette première étape, vous allez apprendre à créer une file d'attente Cloud Tasks standard et à y ajouter des tâches HTTP pour cibler un service Cloud Run.
Que sont les tâches HTTP Target ?
Les tâches HTTP target peuvent cibler n'importe quel service HTTP exécuté sur Compute Engine, Google Kubernetes Engine, Cloud Run, Cloud Functions ou des systèmes sur site de manière sécurisée à l'aide de l'authentification OAuth/OIDC standard dans l'industrie.
Déployer un service Cloud Run
Tout d'abord, assurez-vous que les API requises sont activées:
gcloud services enable \ cloudtasks.googleapis.com \ run.googleapis.com
Déployez un service Cloud Run qui servira de cible des tâches HTTP:
SERVICE1=hello1 REGION=us-central1 gcloud run deploy $SERVICE1 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
Créer une file d'attente Cloud Tasks
Créez une file d'attente Cloud Tasks standard:
QUEUE1=http-queue LOCATION=us-central1 gcloud tasks queues create $QUEUE1 --location=$LOCATION
Suspendez temporairement la file d'attente afin de pouvoir observer les tâches HTTP à mesure qu'elles sont créées:
gcloud tasks queues pause $QUEUE1 --location=$LOCATION
4. Créer et tester une tâche HTTP
Au cours de cette étape, vous allez créer une tâche HTTP pour cibler la file d'attente que vous avez créée précédemment.
Créer une tâche HTTP
Vous pouvez créer des tâches HTTP à l'aide de gcloud
:
gcloud tasks create-http-task \ --queue=$QUEUE1 \ --location=$LOCATION \ --url=$SERVICE1_URL \ --method=GET
Facultatif:Vous pouvez également créer une tâche HTTP avec des bibliothèques clientes. Par exemple, vous pouvez consulter Program.cs
pour obtenir un exemple C# dans lequel une requête HTTP est encapsulée dans un Task
et un TaskRequest
avant d'être envoyée à Cloud Tasks avec 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);
Vous pouvez l'exécuter comme suit pour créer la tâche et l'ajouter à la file d'attente:
dotnet run $PROJECT_ID $LOCATION $QUEUE1 $SERVICE1_URL
Tester la tâche HTTP
À ce stade, la tâche est créée, mais elle n'est pas encore exécutée, car la file d'attente est suspendue. Vous pouvez vérifier cela en répertoriant les files d'attente:
gcloud tasks queues list --location=$LOCATION
La file d'attente doit afficher l'état PAUSED
:
QUEUE_NAME STATE http-queue PAUSED
Réactivez la file d'attente:
gcloud tasks queues resume $QUEUE --location=$LOCATION
Vérifiez les journaux du service Cloud Run:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1
Vous devriez constater que le service Cloud Run a reçu une requête HTTP GET de 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. Créer une file d'attente avec une configuration de routage
Au cours de cette étape, vous allez apprendre à créer une file d'attente Cloud Tasks avec une configuration de routage pour ajouter un remplacement d'URI HTTP à l'aide de la fonctionnalité Configuration du routage des tâches au niveau de la file d'attente. Vous y ajouterez ensuite des tâches HTTP pour cibler le premier service Cloud Run et constaterez que la configuration du routage remplace l'URI pour acheminer les tâches vers le second service Cloud Run.
Qu'est-ce que la configuration du routage des tâches au niveau de la file d'attente ?
La configuration du routage des tâches au niveau de la file d'attente modifie le routage des tâches HTTP pour l'ensemble de la file d'attente, pour toutes les tâches nouvelles et en attente. Cela permet de créer plus facilement des tâches, car la cible HTTP n'a pas besoin d'être définie au niveau de la tâche et le fournisseur de services a davantage de contrôle, car celui-ci peut définir la cible de toutes les tâches d'une file d'attente (par exemple, acheminer le trafic vers un autre backend si le backend d'origine est indisponible).
La configuration suivante peut être définie au niveau de la file d'attente:
- En-têtes: les en-têtes au niveau de la file d'attente, s'ils sont spécifiés au niveau de la file d'attente, entraînent l'insertion automatique des en-têtes pour toutes les tâches de la file d'attente.
- Méthode HTTP: cette méthode HTTP, lorsqu'elle est spécifiée au niveau de la file d'attente, remplace la méthode HTTP pour toutes les tâches de la file d'attente.
- URI cible: l'hôte, le chemin d'accès, la requête, le port ou le schéma (HTTP ou HTTPS) peuvent être remplacés individuellement.
- Authorization: si la configuration OIDC/OAuth est spécifiée au niveau de la file d'attente, elle remplace la configuration OIDC/OAuth au niveau de la tâche.
Déployer un deuxième service Cloud Run
Déployez un deuxième service Cloud Run qui servira ultérieurement de cible pour le remplacement d'URI HTTP:
SERVICE2=hello2 REGION=us-central1 gcloud run deploy $SERVICE2 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
Enregistrez l'hôte de l'URL du service pour l'utiliser plus tard:
SERVICE2_URL=$(gcloud run services describe $SERVICE2 --region $REGION --format 'value(status.url)') SERVICE2_HOST=$(echo $SERVICE2_URL | sed 's,http[s]*://,,g')
Créer une file d'attente Cloud Tasks avec une configuration de routage
Créez une file d'attente avec une configuration de routage avec remplacement d'URI HTTP dans le second service Cloud Run.
QUEUE2=http-queue-uri-override gcloud beta tasks queues create $QUEUE2 \ --http-uri-override=host:$SERVICE2_HOST \ --location=$LOCATION
Notez que le remplacement d'URI fait référence au deuxième service Cloud Run. L'hôte URI d'origine de toute tâche HTTP ajoutée à la file d'attente est remplacé. Vous pouvez voir la configuration de la file d'attente:
gcloud beta tasks queues describe $QUEUE2 --location=$LOCATION
Vous devriez constater que le httpTarget
comporte un uriOverride
pointant vers l'hôte du deuxième service:
httpTarget: uriOverride: host: hello2-idcwffc3yq-uc.a.run.app pathOverride: {} queryOverride: {} ...
Suspendez temporairement la file d'attente afin de pouvoir observer les tâches HTTP à mesure qu'elles sont créées:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
6. Créer et tester une tâche HTTP pour la file d'attente avec la configuration de routage
Au cours de cette étape, vous allez créer une tâche HTTP pour cibler le premier service et observer que son URI est remplacé par la file d'attente pour pointer vers le second service.
Créer une tâche HTTP
Créez une tâche HTTP avec l'URL du premier service:
gcloud tasks create-http-task \ --queue=$QUEUE2 \ --location=$LOCATION \ --url=$SERVICE1_URL \ --method=GET
Tester la tâche HTTP
Réactivez la file d'attente:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
Vous devriez constater que le deuxième service Cloud Run (pas le premier) a reçu une requête HTTP GET de Cloud Tasks en raison du forçage:
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. Modifier les tâches en attente avec la configuration de routage
Vous pouvez également utiliser la configuration de routage pour modifier l'URI HTTP de toutes les tâches en attente dans une file d'attente. Cela s'avère utile lorsque le service de backend tombe en panne et que vous souhaitez accéder rapidement à un autre service. Voyons comment cela fonctionne au cours de cette étape.
Suspendez à nouveau la file d'attente:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
Créez une tâche HTTP avec google.com
comme URL de la tâche:
gcloud tasks create-http-task \ --queue=$QUEUE2 \ --location=$LOCATION \ --url=https://www.google.com \ --method=GET
La tâche est en attente, car la file d'attente est suspendue.
À présent, mettez à jour le forçage de l'URI HTTP pour qu'il pointe vers le premier service. Cette opération va remplacer l'hôte de la tâche en attente google.com
par l'hôte du premier service:
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
Réactivez la file d'attente:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
Vous devriez constater que le premier service Cloud Run a reçu une requête HTTP GET de Cloud Tasks en raison du forçage (au lieu de 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. Créer une file d'attente pour l'API BufferTask
Normalement, vous créez des tâches à l'aide de l'API Tasks, soit à partir de gcloud
, soit des bibliothèques clientes Tasks. Cela oblige les applications à encapsuler les requêtes HTTP dans Tasks à l'aide de bibliothèques clientes, et cela crée également une dépendance entre les applications et les bibliothèques clientes Tasks.
Au cours de cette étape, vous allez apprendre à exploiter le remplacement d'URI HTTP au niveau de la file d'attente et à utiliser la nouvelle API BufferTask pour créer plus facilement des tâches HTTP cibles en envoyant simplement une requête HTTP. Toute application pouvant envoyer des requêtes HTTP peut désormais créer des tâches HTTP cibles.
Qu'est-ce que l'API BufferTask ?
L'API CreateTask est l'ancienne méthode de création de tâches et nécessite que le client envoie un objet Task à l'API avec tous les champs obligatoires définis.
L'API BufferTask est une nouvelle fonctionnalité qui permet aux utilisateurs de créer une tâche HTTP sans avoir à fournir de configuration de tâche (URL HTTP, en-têtes, autorisation). Vous pouvez ainsi simplement envoyer un message ou le corps de votre requête à l'API Buffer.
Cela facilite l'intégration aux services, car vous pouvez désormais déployer Cloud Tasks en amont de votre service sans avoir à modifier le code côté client. Toute requête HTTP arbitraire envoyée à l'API BufferTask sera encapsulée en tant qu'objet Task et transmise à la destination définie au niveau de la file d'attente.
Pour utiliser l'API BufferTask, la configuration de l'URI cible de la file d'attente doit être définie. Autrement dit, la fonctionnalité Configuration du routage au niveau de la file d'attente est une condition préalable à l'utilisation de l'API BufferTask.
Créer une file d'attente Cloud Tasks avec une configuration de routage
Créez une file d'attente avec une configuration de routage pointant vers le premier service que nous avons déployé à l'étape précédente:
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
Suspendez temporairement la file d'attente afin de pouvoir observer les tâches HTTP à mesure qu'elles sont créées:
gcloud tasks queues pause $QUEUE3 --location=$LOCATION
9. Mettre en mémoire tampon les requêtes HTTP avec l'API BufferTask
Au cours de cette étape, vous allez mettre en mémoire tampon les requêtes HTTP GET ou POST simples avec l'API BufferTask. En coulisses, Cloud Tasks encapsule ces requêtes HTTP en tâches HTTP avec les paramètres de configuration de routage par défaut de la file d'attente.
Tout d'abord, connectez-vous pour obtenir un jeton d'accès et définir des variables:
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"
Créer une tâche HTTP
Créer une tâche HTTP avec l'API BufferTask. Notez qu'il s'agit d'une simple requête HTTP GET, qui ne nécessite pas de créer une tâche:
curl -X GET "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN"
Créez une autre tâche HTTP avec une requête HTTP POST et un corps:
curl -X POST "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d "{'message': 'Hello World'}"
Facultatif:Vous pouvez également créer une tâche HTTP avec des bibliothèques clientes. Par exemple, vous pouvez consulter Program.cs
pour obtenir un exemple C# dans lequel une requête HTTP GET est envoyée directement à l'API BufferTask sans avoir à l'encapsuler dans un Task
ni avoir besoin de la bibliothèque cliente pour 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}"); }
Vous pouvez l'exécuter comme suit:
dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN
L'API BufferTask crée une tâche à partir des requêtes HTTP et ajoute l'URL à partir des paramètres de configuration de routage de la file d'attente pour l'URI.
Tester la tâche HTTP
Réactivez la file d'attente:
gcloud tasks queues resume $QUEUE3 --location=$LOCATION
Vous devriez constater que le service Cloud Run a reçu des requêtes HTTP GET et POST de 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. Félicitations
Félicitations, vous avez terminé cet atelier de programmation.
Pour poursuivre, vous pouvez essayer Cloud Tasks comme tampon entre Pub/Sub et Cloud Run pour voir un exemple concret de la façon dont ces nouvelles fonctionnalités de Cloud Tasks peuvent vous aider à créer facilement une file d'attente de tampon entre les services.
Nettoyage (facultatif)
Nous vous recommandons de nettoyer les ressources afin d'éviter que des frais ne vous soient facturés.
Si vous n'avez plus besoin du projet, il vous suffit de le supprimer:
gcloud projects delete $PROJECT_ID
Si vous avez besoin du projet, vous pouvez supprimer les ressources individuellement.
Supprimez les services Cloud Run:
gcloud run services delete $SERVICE1 --region $REGION gcloud run services delete $SERVICE2 --region $REGION
Supprimez les files d'attente Cloud Tasks:
gcloud tasks queues delete $QUEUE1 --location=$LOCATION gcloud tasks queues delete $QUEUE2 --location=$LOCATION gcloud tasks queues delete $QUEUE3 --location=$LOCATION
Points abordés
- Créer des tâches HTTP Target
- Créer des tâches HTTP cibles avec le nouveau remplacement d'URI HTTP au niveau de la file d'attente
- Modifier les tâches en attente avec le nouveau remplacement d'URI HTTP au niveau de la file d'attente
- Découvrez comment mettre plus facilement en mémoire tampon les requêtes HTTP avec la nouvelle API BufferTask.