Configurer les files d'attente Cloud Tasks

Cette page explique comment configurer des files d'attente Cloud Tasks à l'aide de la commande gcloud du SDK Google Cloud.

Configurer votre file d'attente Cloud Tasks

Vous pouvez configurer votre file d'attente Cloud Tasks à sa création ou à tout moment ultérieur. La configuration s'appliquera à toutes les tâches de cette file d'attente.

La configuration des files d'attente comporte trois aspects fondamentaux :

Configurer le routage (files d'attente App Engine uniquement)

La file d'attente doit connaître le nom et la version du service contenant le nœud de calcul approprié. Il s'agit de la cible. Une cible peut être définie de trois façons :

  • Ne définissez pas la cible explicitement. Dans ce cas, le service par défaut est utilisé.
  • Déclarez explicitement la cible dans la tâche elle-même, en définissant AppEngineRouting dans AppEngineHttpRequest. Cette méthode est recommandée si vous souhaitez utiliser une cible autre que la cible par défaut.
  • Acheminez explicitement toutes les tâches d'une file d'attente vers une cible différente de celle par défaut à l'aide de appEngineRoutingOverride. Cette méthode remplace le routage pouvant être défini dans la tâche elle-même.

Pour utiliser gcloud afin de configurer ce routage différent de celui par défaut au niveau de la file d'attente et donc de remplacer tout routage au niveau de la tâche :

gcloud tasks queues update [QUEUE_ID] \
    --routing-override=service:[SERVICE],version:[VERSION]

où :

  • SERVICE correspond au service de nœud de calcul App Engine responsable de la gestion des tâches.
  • VERSION correspond à la version de l'application.

Par exemple, si vous configurez un service de nœuds de calcul appelé worker pour gérer toutes les tâches dans une file d'attente appelée barbequeue, vous pouvez diriger le routage vers ce service et la version par défaut en appelant :

gcloud tasks queues update barbequeue \
    --routing-override=service:worker

Décrivez (Describe) la file d'attente :

gcloud tasks queues describe barbequeue

Un résultat semblable aux lignes suivantes doit s'afficher :

appEngineRoutingOverride:
  host: worker.[PROJECT_ID].appspot.com
  service: worker
name: projects/[PROJECT_ID]/locations/[LOCATION_ID]/queues/barbequeue
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

Définir des limites de débit

Vous pouvez définir le débit maximal et le nombre de tâches simultanées pouvant être envoyées par une file d'attente.

gcloud tasks queues update [QUEUE_ID] \
    --max-dispatches-per-second=[DISPATCH_RATE] \
    --max-concurrent-dispatches=[MAX_RUNNING]

où :

  • DISPATCH_RATE correspond en fait à la fréquence d'actualisation des jetons dans le bucket. Dans les conditions où le flux de tâches est relativement stable, il s'agit de la vitesse à laquelle les tâches sont envoyées.
  • MAX_RUNNING correspond au nombre maximal de tâches de la file d'attente pouvant être exécutées.

Par exemple, si vous avez créé une file d'attente appelée barbequeue sans définir de paramètres, vous pouvez mettre à jour le nombre maximal de tâches simultanées en appelant :

gcloud tasks queues update barbequeue \
        --max-concurrent-dispatches=20

Décrivez (Describe) la file d'attente :

gcloud tasks queues describe barbequeue

Un résultat semblable aux lignes suivantes doit s'afficher :

name: projects/[PROJECT_ID]/locations/[LOCATION_ID]/queues/barbequeue
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 20
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

Définir les taux de traitement avec les commandes gcloud et avec queue.yaml

L'approche de l'API Cloud Tasks pour définir les taux de traitement des files d'attente diffère légèrement de celle recourant à l'importation de fichiers queue.yaml, même si les deux méthodes aboutissent à des files d'attente utilisant le même mécanisme sous-jacent.

Dans les deux cas, la file d'attente utilise l'algorithme de token bucket (seau à jetons) pour contrôler le taux d'exécution des tâches. Chaque file d'attente nommée possède un bucket contenant ses jetons.

Chaque fois que l'application exécute une tâche, un jeton est supprimé du bucket. La file d'attente continue de traiter les tâches jusqu'à ce que le bucket n'ait plus de jetons. Le système remplit le bucket avec de nouveaux jetons en continu, en fonction du taux max_dispatches_per_second que vous spécifiez pour la file d'attente. Si votre file d'attente contient des tâches à traiter et que le bucket contient des jetons, le système traite simultanément autant de tâches que de jetons jusqu'à la valeur max_concurrent_dispatches que vous avez définie.

Une charge inégale peut augmenter considérablement le nombre de jetons dans le bucket, ce qui peut entraîner des utilisations intensives du traitement lorsqu'une vague de requêtes arrive. Dans ce cas, votre file d'attente peut présenter un taux de distribution réel supérieur à votre taux max_dispatches_per_second, consommant des ressources système et entrant en concurrence avec les requêtes servant les utilisateurs. Si vous utilisez des files d'attente pour gérer des taux de distribution basés sur des contrats de niveau de service relativement lents pour des services en aval, vous pouvez obtenir des erreurs telles que HTTP 429 (Trop de demandes) ou 503 (Service non disponible).

Lorsque vous utilisez une méthode impliquant l'API Cloud Tasks, vous disposez de deux champs pour définir le taux de distribution de la file d'attente :

  • max_dispatches_per_second
  • max_concurrent_dispatches

comme indiqué dans l'exemple ci-dessus. Un troisième champ, max_burst_size, est calculé par le système en fonction de la valeur que vous avez définie pour max_dispatches_per_second.

Lorsque vous utilisez la méthode queue.yaml, vous pouvez définir les trois éléments :

  • max_concurrent_requests, qui équivaut à max_concurrent_dispatches
  • rate, qui équivaut à max_dispatches_per_second
  • bucket_size, qui équivaut à max_burst_size

Dans la plupart des cas, l'utilisation de la méthode de l'API Cloud Tasks et la définition de max_burst_size par le système permettent d'obtenir un taux très efficace de gestion des vagues de requêtes. Toutefois, dans certains cas, en particulier lorsque le taux souhaité est relativement lent, utilisez la méthode queue.yaml pour définir manuellement bucket_size sur une petite valeur ou définir max_concurrent_dispatches sur une petite valeur via l'API Cloud Tasks peut vous donner plus de contrôle.

Définir les paramètres de nouvelle tentative

Si une tâche ne s'effectue pas correctement, Cloud Tasks la relance avec un intervalle exponentiel entre les tentatives en fonction des paramètres que vous avez définis. Vous pouvez spécifier le nombre maximum de nouvelles tentatives liées aux tâches ayant échoué dans la file d'attente, définir une limite de temps pour les nouvelles tentatives et contrôler l'intervalle entre les tentatives.

gcloud tasks queues update [QUEUE_ID] \
    --max-attempts=[MAX_ATTEMPTS] \
    --min-backoff=[MIN_INTERVAL] \
    --max-backoff=[MAX_INTERVAL] \
    --max-doublings=[MAX_DOUBLINGS] \
    --max-retry-duration=[MAX_RETRY_DURATION]

où :

  • MAX_ATTEMPTS correspond au nombre maximal de tentatives pour une tâche, y compris la première tentative. Vous pouvez autoriser des tentatives illimitées en définissant cette option sur unlimited.
  • MIN_INTERVAL correspond à la durée minimale d'attente entre les nouvelles tentatives. La valeur doit être une chaîne qui se termine par "s", telle que 5s.
  • MAX_INTERVAL correspond à la durée maximale d'attente entre les nouvelles tentatives. La valeur doit être une chaîne qui se termine par "s", telle que 5s.
  • MAX_DOUBLINGS correspond au nombre maximal de fois où l'intervalle entre les tentatives ayant échoué est doublé avant que l'augmentation ne devienne constante.
  • MAX_RETRY_DURATION correspond à la durée maximale de la nouvelle tentative d'une tâche ayant échoué. La valeur doit être une chaîne qui se termine par "s", telle que 5s.

Vérifiez que la file d'attente a bien été configurée :

gcloud tasks queues describe [QUEUE_ID]

Étape suivante