Créer des files d'attente d'envoi

Cette page explique comment créer et personnaliser une file d'attente d'envoi et comment examiner le contenu d'une file d'attente.

Utiliser un fichier de configuration de file d'attente pour créer des files d'attente

Pour traiter une tâche, vous devez l'ajouter à une file d'attente. App Engine propose une file d'attente d'envoi par défaut, nommée default, qui est configurée et prête à être utilisée avec les paramètres par défaut. Si vous le souhaitez, vous pouvez simplement ajouter toutes vos tâches à la file d'attente par défaut, sans avoir à créer et configurer d'autres files d'attente.

Pour ajouter des files d'attente ou changer la configuration par défaut, modifiez le fichier de configuration de file d'attente de votre application, que vous transférerez ensuite vers App Engine. Vous pouvez créer jusqu'à 100 files d'attente. Les files d'attente ne peuvent pas être créées dynamiquement.

Ce fichier de configuration de file d'attente définit deux files d'attente :

queue:
- name: queue-blue
  target: v2.task-module
  rate: 5/s

- name: queue-red
  rate: 1/s

Pour importer le fichier :

gcloud app deploy queue.yaml

Toutes les tâches ajoutées à queue-blue sont envoyées au module cible v2.task-module. La fréquence d'actualisation de queue-red passe de 5/s à 1/s. Les tâches seront retirées de la file d'attente et envoyées à leur cible à raison d'une tâche par seconde.

Si vous supprimez une file d'attente, vous devez attendre environ sept jours avant de créer une file d'attente portant le même nom.

De nombreux autres paramètres peuvent être ajoutés au fichier de configuration pour personnaliser le comportement d'une file d'attente d'envoi. Pour en savoir plus, reportez-vous à la documentation de référence sur le fichier de configuration de file d'attente.

Définir le taux de traitement de la file d'attente d'envoi

Vous pouvez contrôler le taux de traitement des tâches dans chacune de vos files d'attente en définissant d'autres directives, telles que rate, bucket_size et max_concurrent_requests.

La file d'attente de tâches utilise des token buckets (seaux à jetons) pour contrôler le taux d'exécution des tâches. Chaque file d'attente nommée possède un token bucket (seau à jetons) qui contient des jetons dont le nombre maximal est spécifié par la valeur bucket_size, ou cinq jetons maximum si vous ne spécifiez pas la taille du bucket.

Chaque fois que l'application exécute une tâche, un jeton est supprimé du bucket. L'application continue de traiter des tâches de la file d'attente jusqu'à ce que le bucket n'ait plus de jetons. App Engine remplit le bucket de nouveaux jetons de manière continue en fonction de la valeur rate que vous avez spécifiée pour la file d'attente.

Si la file d'attente contient des tâches à traiter et que son bucket contient des jetons, App Engine traite simultanément autant de tâches qu'il y a de jetons. Cela peut entraîner des rafales de traitement, ce qui consomme des ressources système et concurrence les requêtes servant les utilisateurs.

Si vous souhaitez empêcher l'exécution simultanée d'un trop grand nombre de tâches ou éviter les conflits dans le datastore, utilisez max_concurrent_requests.

L'exemple suivant montre comment définir max_concurrent_requests pour limiter les tâches et comment ajuster la taille et le taux du bucket en fonction des besoins et des ressources disponibles :

queue:
- name: queue-blue
  rate: 20/s
  bucket_size: 40
  max_concurrent_requests: 10

Définir des limites de stockage pour toutes les files d'attente

Vous pouvez vous servir du fichier de configuration de file d'attente pour définir la quantité totale d'espace de stockage que les données de tâche peuvent utiliser sur l'ensemble des files d'attente. Pour définir la limite de stockage total, incluez un élément nommé total_storage_limit au niveau supérieur :

# Set the total storage limit for all queues to 120MB
total_storage_limit: 120M
queue:
- name: queue-blue
  rate: 35/s

La valeur est un nombre suivi d'une unité : B pour les octets, K pour les kilo-octets, M pour les mégaoctets, G pour les gigaoctets et T pour les téraoctets. Par exemple, la valeur 100K spécifie une limite de 100 kilo-octets. Si l'ajout d'une tâche risque de provoquer le dépassement de la limite autorisée pour le stockage, la demande d'ajout de la tâche à la file d'attente échoue. La limite par défaut est de 500M (500 mégaoctets) pour les applications gratuites. Pour les applications facturées, il n'y a pas de limite tant que vous n'en définissez pas une explicitement. Vous pouvez utiliser cette limite pour protéger votre application contre une erreur de programmation fork bomb dans laquelle chaque tâche ajoute plusieurs autres tâches au cours de son exécution.

Si votre application reçoit des erreurs pour un quota insuffisant lors de l'ajout de tâches, il peut être utile d'augmenter la limite de stockage total. Si vous utilisez cette fonctionnalité, il est vivement recommandé de définir une limite correspondant au stockage requis sur plusieurs jours de tâches. Cela permet aux files d'attente d'être temporairement sauvegardées et de continuer d'accepter de nouvelles tâches tout en résolvant celles en attente et en étant protégées contre les erreurs de programmation.

Configurer le nombre maximal de requêtes simultanées

Vous pouvez contrôler le taux de traitement en définissant max_concurrent_requests, ce qui limite le nombre de tâches pouvant être exécutées simultanément.

Si la vitesse de traitement de la file d'attente de l'application est de 20/s et que le bucket contient 40 jetons, les tâches de la file sont exécutées à une vitesse de 20/s avec de brefs pics à 40/s. Ces paramètres sont appropriés si la latence des tâches est relativement basse. Toutefois, si elle augmente de manière significative, le nombre de tâches exécutées simultanément sera bien plus important. Cette charge supplémentaire peut utiliser des instances supplémentaires et ralentir l'application.

Supposons par exemple que la latence normale des tâches est de 0,3 seconde. À cette latence, vous traitez environ 40 tâches simultanément. Cependant, si cette latence passe à 5 secondes, plus de 100 tâches peuvent être facilement exécutées simultanément. Cette augmentation contraint l'application d'utiliser plus d'instances pour traiter le supplément de tâches, ce qui peut ralentir toute l'application et interférer avec les requêtes des utilisateurs. Pour éviter cela, il vous suffit de paramétrer max_concurrent_requests sur une valeur plus faible.

Par exemple, si vous définissez max_concurrent_requests sur 10, la file d'attente de l'exemple précédent traite environ 20 tâches par seconde lorsque la latence est de 0,3 seconde. Lorsque la latence dépasse 0,5 seconde, ce paramètre régule la fréquence de traitement de sorte qu'un maximum de 10 tâches soient exécutées simultanément.

queue:
# Set the max number of concurrent requests to 50
- name: optimize-queue
  rate: 20/s
  bucket_size: 40
  max_concurrent_requests: 10

Surveiller les files d'attente dans la console Google Cloud

  1. Dans la console Google Cloud, accédez à la page Cloud Tasks.

    Accéder à Cloud Tasks

    Notez que, si vous accédez à la page de la File d'attente de tâches d'App Engine, des instructions vous guideront vers la page Cloud Tasks. Cette mise à jour dans la console Google Cloud ne modifie pas le fonctionnement des files d'attente de tâches.

  2. Activez l'API Cloud Tasks.

  3. Une fois sur la page Cloud Tasks, vous verrez la liste de toutes les files d'attente de l'application. Cliquez sur le nom d'une file d'attente pour afficher la page Détails de la file d'attente, qui répertorie toutes les tâches de la file d'attente sélectionnée.

Étape suivante

Découvrez comment créer des tâches.