Configurer le routage, les limites et les nouvelles tentatives des files d'attente

Cloud Tasks vous permet de gérer l'exécution des tâches en définissant le routage au niveau de la file d'attente , les limites de débit et le comportement des nouvelles tentatives. Vous pouvez configurer ces paramètres lorsque vous créez une file d'attente ou que vous en mettez à jour une existante. Les options de configuration utilisées par gcloud tasks queues create ou gcloud tasks queues update sont identiques.

La configuration de l'authentification au niveau de la file d'attente remplace l'authentification au niveau de la tâche. Pour en savoir plus, consultez la section Utiliser des tâches HTTP Target avec des jetons d'authentification.

Configurer le routage au niveau de la file d'attente

La configuration du routage au niveau de la file d'attente remplace le routage défini au niveau de la tâche. Cela est utile si vous souhaitez utiliser Cloud Tasks comme tampon devant votre service cible ou si vous devez modifier le routage pour toutes les tâches d'une file d'attente.

Le routage au niveau de la file d'attente s'applique aux éléments suivants :

  • Tâches qui se trouvent dans la file d'attente
  • Tâches ajoutées à la file d'attente après la configuration du routage au niveau de la file d'attente

Limites

Le routage au niveau de la file d'attente n'est pas compatible avec les clés de chiffrement gérées par le client (CMEK) de Cloud Key Management Service (Cloud KMS). Si la CMEK est activée, vous ne pouvez pas effectuer les opérations suivantes :

  • Créer des tâches dans une file d'attente avec routage au niveau de la file d'attente
  • Appliquer le routage au niveau de la file d'attente

Configurer le routage au niveau de la file d'attente pour les tâches HTTP

Vous pouvez configurer une file d'attente pour remplacer le routage au niveau de la tâche lorsque vous créez la file d'attente ou que vous la mettez à jour. Pour configurer le calcul d'itinéraire au niveau de la file d'attente, définissez le paramètre uriOverride de la file d'attente sur l'itinéraire recommandé de votre choix.

Si vous appliquez le routage au niveau de la file d'attente en tant que mise à jour d'une file d'attente existante, mettez la file d'attente en pause avant d'appliquer les modifications, puis attendez une minute après avoir appliqué les modifications pour reprendre la file d'attente.

  1. Mettez la file d'attente en pause en exécutant la commande suivante :

      gcloud tasks queues pause QUEUE_ID
      

    Remplacez QUEUE_ID par l'ID de votre file d'attente.

  2. Mettez à jour ou supprimez le routage au niveau de la file d'attente.

    • Pour mettre à jour le routage au niveau de la file d'attente, définissez le uriOverride paramètre sur votre route mise à jour.

    • Pour supprimer le routage au niveau de la file d'attente à l'aide de l'API REST ou RPC :

      • API REST : envoyez une patch requête pour la file d'attente avec une charge utile vide et le paramètre updateMask défini sur httpTarget.

      • API RPC : envoyez une updateQueueRequest pour la file d'attente avec une charge utile vide et le paramètre update_mask défini sur http_target.

    L'exemple suivant utilise l'API REST pour mettre à jour l'hôte vers lequel les tâches sont routées :

    curl -X PATCH -d @- -i \
      -H "Authorization: Bearer ACCESS_TOKEN" \
      -H "Content-Type: application/json" \
      "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID?updateMask=httpTarget.uriOverride" << EOF
    {
      "httpTarget": {"uriOverride":{"host":"NEW_HOST"}}
    }
    EOF
    

    Remplacez les éléments suivants :

    • ACCESS_TOKEN : votre jeton d'accès. Pour l'obtenir, exécutez la commande suivante dans votre terminal :

      gcloud auth application-default login
      gcloud auth application-default print-access-token
    • PROJECT_ID : ID de votre Google Cloud projet. Pour l'obtenir, exécutez la commande suivante dans votre terminal :

      gcloud config get-value project

    • LOCATION : emplacement de votre file d'attente.

    • NEW_HOST: nouvel hôte vers lequel vous souhaitez que votre file d'attente soit routée.

  3. Attendez une minute.

    L'application de la nouvelle configuration peut prendre jusqu'à une minute. Attendre avant de reprendre la file d'attente permet d'éviter que les tâches ne soient distribuées avec l'ancienne configuration.

  4. Reprenez la file d'attente en exécutant la commande suivante :

    gcloud tasks queues resume QUEUE_ID

Configurer le routage au niveau de la file d'attente pour les tâches App Engine

Pour configurer le routage au niveau de la file d'attente pour les tâches App Engine, définissez le paramètre appEngineRoutingOverride de la file d'attente sur le service et la version App Engine de votre choix.

  1. Configurez le routage au niveau de la file d'attente et remplacez tout routage au niveau de la tâche :

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

    Remplacez les éléments suivants :

    • QUEUE_ID : ID de la file d'attente (son nom court).
    • SERVICE: service de nœuds de calcul App Engine responsable de la gestion des tâches.
    • VERSION : version de l'application.

    Par exemple, si vous configurez un service de nœuds de calcul pour gérer toutes les tâches d'une file d'attente, vous pouvez le router vers ce service et la version par défaut :

    gcloud tasks queues update QUEUE_ID \
        --routing-override=service:SERVICE
  2. Vérifiez que votre file d'attente a été configurée correctement en exécutant la commande suivante :

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Remplacez LOCATION par l'emplacement de la file d'attente.

    La sortie devrait ressembler à ce qui suit :

    appEngineRoutingOverride:
      host: SERVICE.PROJECT_ID.appspot.com
      service: SERVICE
    name: projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID
    rateLimits:
      maxBurstSize: 100
      maxConcurrentDispatches: 1000
      maxDispatchesPerSecond: 500.0
    retryConfig:
      maxAttempts: 100
      maxBackoff: 3600s
      maxDoublings: 16
      minBackoff: 0.100s
    state: RUNNING
  3. Pour supprimer le routage au niveau de la file d'attente, exécutez la commande suivante :

    gcloud tasks queues update QUEUE_ID \
        --clear-routing-override

    Lorsque le routage au niveau de la file d'attente est supprimé, le routage au niveau de la tâche est appliqué aux tâches de la file d'attente et aux tâches ajoutées à la file d'attente à l'avenir.

Définir des limites de débit

La limite de débit détermine le débit maximal auquel les tâches peuvent être distribuées par une file d'attente, qu'il s'agisse d'une première tentative ou d'une nouvelle tentative.

  1. Définissez le débit maximal et le nombre de tâches simultanées pouvant être distribuées par une file d'attente en exécutant la commande suivante :

    gcloud tasks queues update QUEUE_ID \
        --max-dispatches-per-second=DISPATCH_RATE \
        --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES

    Remplacez les éléments suivants :

    • QUEUE_ID : ID de la file d'attente (son nom court).
    • DISPATCH_RATE : débit. Il s'agit du débit auquel les jetons du bucket sont actualisés. 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_CONCURRENT_DISPATCHES: nombre maximal de tâches de la file d'attente pouvant s'exécuter simultanément.

    Par exemple, si vous avez créé une file d'attente sans définir de paramètres, vous pouvez mettre à jour le nombre maximal de tâches simultanées en exécutant la commande suivante :

    gcloud tasks queues update QUEUE_ID \
        --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES
  2. Vérifiez que votre file d'attente a été configurée correctement en exécutant la commande suivante :

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Remplacez LOCATION par l'emplacement de la file d'attente.

    La sortie devrait ressembler à ce qui suit :

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

Méthodes pour définir les taux de traitement des files d'attente

Vous pouvez définir les taux de traitement des files d'attente à l'aide de l'API Cloud Tasks ou en important un fichier queue.yaml. Les deux méthodes aboutissent à des files d'attente qui utilisent 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 son bucket soit vide. 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 de la file d'attente 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 HTTP 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

    Un troisième champ, max_burst_size, est calculé par le système en fonction de la valeur que vous définissez pour max_dispatches_per_second. Pour en savoir plus, consultez les messages RateLimits.

  • Lorsque vous utilisez la queue.yaml méthode, 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 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 requis 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 à l'aide de 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. Une fois qu'une tâche s'est exécutée correctement, elle est supprimée de la file d'attente. Dans tous les cas, la limite maximale de conservation des tâches s'applique également.

Vous pouvez éventuellement spécifier une configuration de nouvelles tentatives au niveau de la tâche, qui remplace la configuration de nouvelles tentatives au niveau de la file d'attente pour la tâche. Pour en savoir plus, consultez la section Définir les paramètres de nouvelle tentative pour une tâche.

  1. Spécifiez le nombre maximal de nouvelles tentatives pour les tâches ayant échoué dans la file d'attente, définissez une limite de temps pour les tentatives et contrôlez l'intervalle entre les tentatives en exécutant la commande suivante :

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

    Remplacez les éléments suivants :

    • QUEUE_ID : ID de la file d'attente (son nom court).
    • MAX_ATTEMPTS: nombre maximal de tentatives pour une tâche, y compris la première. Pour autoriser un nombre illimité de nouvelles tentatives, définissez cette valeur sur -1. MAX_RETRY_DURATION s'applique toujours même si MAX_ATTEMPTS est atteint ou défini sur -1.
    • MAX_RETRY_DURATION: durée maximale de la nouvelle tentative d'une tâche ayant échoué, mesurée à partir de la première tentative. La valeur doit être une chaîne se terminant par "s", par exemple 5s. Pour spécifier une durée illimitée, définissez cette valeur sur 0s. MAX_ATTEMPTS s'applique toujours même si MAX_RETRY_DURATION est atteint ou défini sur 0s.
    • MIN_INTERVAL: délai minimal à attendre entre les tentatives. La valeur doit être une chaîne se terminant par "s", par exemple 5s.
    • MAX_INTERVAL: délai maximal à attendre entre les tentatives. La valeur doit être une chaîne se terminant par "s", par exemple 5s.
    • MAX_DOUBLINGS: nombre maximal de fois où l'intervalle entre les nouvelles tentatives de tâches ayant échoué sera doublé avant que l'augmentation ne devienne constante. L'intervalle de nouvelles tentatives d'une tâche commence à MIN_INTERVAL, puis double MAX_DOUBLINGS fois, puis augmente de manière linéaire, et enfin effectue de nouvelles tentatives à des intervalles de MAX_INTERVAL jusqu'à MAX_ATTEMPTS fois.

      Par exemple, si MIN_INTERVAL est 10s, MAX_INTERVAL est 300s, et MAX_DOUBLINGS est 3, l'intervalle de nouvelles tentatives doublera 3 fois, augmentera de manière linéaire de 2^3 * 10s, puis effectuera de nouvelles tentatives à des intervalles de MAX_INTERVAL jusqu'à ce que la tâche ait été tentée MAX_ATTEMPTS fois : 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s, etc.

Pour en savoir plus sur les paramètres, consultez les RetryConfig paramètres de la ressource Queue.

  1. Vérifiez que votre file d'attente a été configurée correctement en exécutant la commande suivante :

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Remplacez LOCATION par l'emplacement de la file d'attente.

    La sortie doit contenir les paramètres de nouvelle tentative que vous avez définis.

Étape suivante