View a markdown version of this page

Faites évoluer les services Amazon ECS en fonction d'une file d'attente Amazon SQS - Amazon Elastic Container Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Faites évoluer les services Amazon ECS en fonction d'une file d'attente Amazon SQS

Vous pouvez adapter votre service Amazon ECS en fonction de la charge d'une file d'attente Amazon Simple Queue Service (Amazon SQS). Cela est utile pour les applications asynchrones dans lesquelles les tâches de votre service agissent en tant que travailleurs qui consomment et traitent les messages d'une file d'attente. À mesure que le taux de messages entrants change, Amazon ECS Service Auto Scaling ajoute des tâches lorsque la file d'attente s'accumule et supprime des tâches lorsqu'elle est épuisée. Cela permet de maintenir la latence des messages en attente dans la file d'attente à un niveau acceptable sans surprovisionnement.

Utiliser la métrique du backlog par tâche

Amazon SQS publie la profondeur d'une file d'attente pour CloudWatch en tant que ApproximateNumberOfMessagesVisible métrique, qui indique le nombre de messages disponibles pour la récupération. La profondeur de la file d'attente indique qu'il y a du travail à faire, mais il ne s'agit pas d'une métrique fiable sur laquelle il est possible de s'appuyer directement. Le nombre de messages dans la file d'attente ne change pas proportionnellement au nombre de tâches qui la traitent. Le nombre de tâches dont vous avez besoin dépend également d'autres facteurs, tels que le temps nécessaire pour traiter un message et le niveau de latence acceptable (délai de file d'attente). Une politique de suivi des cibles qui suit la profondeur de la file d'attente interprète une file d'attente importante comme une demande pour un plus grand nombre de tâches. Cela peut entraîner une extension de votre service bien au-delà de la charge de travail requise et une augmentation des coûts.

Au lieu de cela, calculez sur arriéré par tâche: la profondeur de la file d'attente divisée par le nombre de tâches en cours d'exécution. Vous calculez cette valeur à l'aide d'un CloudWatch expression mathématique métrique qui divise la profondeur de la file d'attente par le nombre de tâches en cours. Le backlog par tâche normalise la profondeur de la file d'attente en fonction du nombre de tâches en cours. Cela le rend proportionnel à la charge de chaque tâche et convient donc à la mise à l'échelle.

Définissez votre valeur cible sur arriéré acceptable par tâche. Pour le calculer, divisez la latence que votre application peut accepter par le temps moyen nécessaire à une tâche pour traiter un message.

Par exemple, si la latence acceptable est de 10 secondes et qu'une tâche prend 0,1 seconde pour traiter un message, le backlog acceptable par tâche est de 10 divisé par 0,1, ce qui équivaut à 100 messages par tâche. Il s'agit de la valeur cible de votre police. Si la file d'attente contient actuellement 1 500 messages et que 10 tâches sont en cours d'exécution, le backlog par tâche est de 150 (1 500 divisés par 10), ce qui dépasse l'objectif. Votre service est divisé en cinq tâches afin de ramener l'arriéré par tâche au prorata de la valeur cible.

Utiliser les mathématiques métriques pour calculer la métrique

Prise en charge des politiques de suivi des cibles Application Auto Scaling CloudWatch mathématiques métriques. Les mathématiques métriques vous permettent d'interroger plusieurs CloudWatch métriques et utilisez des expressions mathématiques pour créer une nouvelle série chronologique basée sur ces métriques. Vous utilisez une expression mathématique métrique pour calculer le backlog par tâche directement dans la politique de dimensionnement. L'application Auto Scaling évalue l'expression et gère CloudWatch des alarmes qui déclenchent les activités de dimensionnement. Pour plus d'informations, voir Utiliser les mathématiques métriques dans le CloudWatch Guide de l'utilisateur.

Pour calculer le backlog par tâche, vous utilisez les deux méthodes suivantes CloudWatch indicateurs :

  • ApproximateNumberOfMessagesVisible (les Sum statistique) à partir du AWS/SQS espace de noms, pour le nombre de messages en attente dans la file d'attente.

  • RunningTaskCount (les Average statistique) à partir du ECS/ContainerInsights espace de noms, pour le nombre de tâches en cours d'exécution dans votre service. Pour utiliser cette métrique, vous devez activer CloudWatch Container Insights pour votre cluster. Pour plus d’informations, consultez Surveillance des conteneurs Amazon ECS au moyen de Container Insights avec observabilité améliorée.

Dans l'exemple suivant, m1 est la profondeur de la file d'attente et m2 est le nombre de tâches en cours. L'expression mathématique métrique m1 / m2 produit le backlog par tâche. Application Auto Scaling ajuste le nombre de tâches de votre service pour maintenir cette valeur à votre valeur cible.

Utilisez la mise à l'échelle par étapes pour plus de contrôle

Nous recommandons le suivi des cibles pour la plupart des charges de travail basées sur des files d'attente, car il s'agit de l'approche la plus simple. Vous définissez une valeur cible unique, et Amazon ECS Service Auto Scaling crée et gère CloudWatch les alarmes et les réglages de mise à l'échelle pour vous.

Utilisez la mise à l'échelle par étapes lorsque vous souhaitez contrôler totalement le comportement de mise à l'échelle. Grâce à la mise à l'échelle par étapes, vous créez votre propre CloudWatch alarmes et définissez des politiques de scale-out et de scale-in distinctes, chacune avec ses propres ajustements d'étape. Vous insérez l'expression mathématique de la métrique du backlog par tâche dans les alarmes et définissez l'action de chaque alarme selon la politique correspondante. Cela vous permet de contrôler les éléments suivants :

  • La taille de chaque étape de mise à l'échelle — Vous pouvez définir des ajustements par étapes qui ajoutent d'autres tâches à mesure que l'arriéré augmente, de sorte qu'une petite faille ajoute quelques tâches et une violation importante en ajoute plusieurs. Vous pouvez effectuer une mise à l'échelle en fonction d'un pourcentage du nombre de tâches en cours ou d'un nombre fixe de tâches.

  • La rapidité avec laquelle le dimensionnement réagit — Vous contrôlez la réactivité grâce à la fréquence de publication des métriques et aux paramètres d'évaluation des alarmes. Par exemple, vous pouvez publier une métrique de file d'attente en haute résolution toutes les 10 secondes et configurer une alarme de scale-out pour contourner un point de données unique, afin que le service réagisse à un arriéré croissant plus rapidement que ne le permet la résolution par défaut d'une minute.

  • Comportement différent lors de la mise à l'échelle et de la mise à l'échelle — Étant donné que le scale-out et le scale-in sont des politiques et des alarmes distinctes, vous pouvez réagir rapidement à un arriéré croissant tout en procédant à une mise à l'échelle de manière prudente. Par exemple, vous pouvez exiger que l'arriéré reste faible pendant plusieurs minutes avant de supprimer des tâches.

Pour plus d’informations, consultez Utilisez des incréments prédéfinis en fonction de CloudWatch alarmes pour faire évoluer les services Amazon ECS.

Protégez les tâches qui traitent des messages

Lorsque votre service évolue, Amazon ECS Service Auto Scaling peut arrêter une tâche qui traite toujours un message. Dans le cas d'un travail de longue durée ou non idempotent, cela peut entraîner le retraitement du message ou la perte de sa progression. Pour éviter cela, utilisez la protection évolutive des tâches pour marquer une tâche comme protégée pendant qu'elle est en cours de travail.

Pour les personnes chargées des files d'attente, nous recommandons que la tâche se protège elle-même via le point de terminaison de l'agent de conteneur Amazon ECS. Lorsque la tâche commence à traiter un message, elle définit le ProtectionEnabled attribuer à true afin qu'Amazon ECS ne l'arrête pas lors d'un événement de scale-in. Une fois que la tâche a terminé le message, elle définit ProtectionEnabled pour false afin que la tâche puisse à nouveau être résiliée. Pour plus d’informations, consultez Protection de vos tâches Amazon ECS pour éviter qu’elles ne soient interrompues par des événements de réduction horizontale.

Considérations

Lorsque vous configurez la mise à l'échelle basée sur les files d'attente pour votre service Amazon ECS, tenez compte des points suivants :

  • Étant donné que Application Auto Scaling évalue l'expression mathématique des métriques pour vous, vous n'avez pas besoin de publier de métrique personnalisée ni d'exécuter de code supplémentaire pour calculer le backlog par tâche.

  • Le RunningTaskCount la métrique n'est disponible que lorsque CloudWatch Container Insights est activé pour votre cluster. Si ce n'est pas le cas, l'expression mathématique métrique ne contient aucune donnée pour le diviseur et la mise à l'échelle n'a pas lieu.

  • Choisissez une valeur cible en fonction de la latence autorisée par le contrat de niveau de service (SLA) de votre application. Une valeur cible inférieure réduit le délai de file d'attente tout en exécutant plus de tâches. Une valeur cible plus élevée réduit les coûts mais augmente le temps d'attente des messages dans la file d'attente.

  • Les messages dont le traitement n'est pas terminé lorsqu'une tâche est arrêtée sont renvoyés dans la file d'attente Amazon SQS. Une autre tâche en cours peut les traiter si vous configurez correctement le délai de visibilité. Pour empêcher l'arrêt d'une tâche pendant le traitement d'un message, utilisez la protection évolutive des tâches, comme décrit dans Protégez les tâches qui traitent des messages.

  • Les considérations générales relatives à Amazon ECS Service Auto Scaling et au suivi des cibles s'appliquent également à la mise à l'échelle basée sur les files d'attente.

Configurer le dimensionnement en fonction des files d'attente

Les étapes suivantes montrent comment créer une politique de dimensionnement du suivi des cibles qui utilise une expression mathématique métrique pour dimensionner votre service Amazon ECS en fonction du backlog par tâche. Vous utilisez le AWS CLI pour ces tâches.

  1. Vérifiez que vous disposez des autorisations IAM requises pour créer et mettre à jour des services et pour enregistrer des cibles évolutives et des politiques de dimensionnement. Pour plus d’informations, consultez Autorisations IAM requises pour l’autoscaling d’un service Amazon ECS.

  2. Allumer CloudWatch Container Insights pour votre cluster afin que RunningTaskCount la métrique est disponible. Pour plus d’informations, consultez Surveillance des conteneurs Amazon ECS au moyen de Container Insights avec observabilité améliorée.

  3. Enregistrez votre service Amazon ECS en tant que cible évolutive à l'aide du register-scalable-target commande. La dimension évolutive est ecs:service:DesiredCount.

    aws application-autoscaling register-scalable-target \ --service-namespace ecs \ --scalable-dimension ecs:service:DesiredCount \ --resource-id service/my-cluster/my-service \ --min-capacity 1 \ --max-capacity 10
  4. Stockez l'expression mathématique métrique dans une spécification métrique personnalisée dans un fichier JSON nommé config.json. Remplacez le nom de la file d'attente, le nom du cluster et le nom du service par vos propres valeurs, puis définissez TargetValue au backlog acceptable par tâche que vous avez calculé.

    { "CustomizedMetricSpecification": { "Metrics": [ { "Label": "Get the queue depth", "Id": "m1", "MetricStat": { "Metric": { "MetricName": "ApproximateNumberOfMessagesVisible", "Namespace": "AWS/SQS", "Dimensions": [ { "Name": "QueueName", "Value": "my-queue" } ] }, "Stat": "Sum" }, "ReturnData": false }, { "Label": "Get the running task count", "Id": "m2", "MetricStat": { "Metric": { "MetricName": "RunningTaskCount", "Namespace": "ECS/ContainerInsights", "Dimensions": [ { "Name": "ClusterName", "Value": "my-cluster" }, { "Name": "ServiceName", "Value": "my-service" } ] }, "Stat": "Average" }, "ReturnData": false }, { "Label": "Calculate the backlog per task", "Id": "e1", "Expression": "m1 / m2", "ReturnData": true } ] }, "TargetValue": 100 }
  5. Créez la politique de dimensionnement du suivi des cibles à l'aide du politique de mise à l'échelle commande avec le fichier JSON en entrée. L'application Auto Scaling crée et gère les deux CloudWatch alarmes (une pour le scale-out et l'autre pour le scale-in) qui invoquent la politique.

    aws application-autoscaling put-scaling-policy \ --policy-name sqs-backlog-target-tracking-policy \ --service-namespace ecs \ --resource-id service/my-cluster/my-service \ --scalable-dimension ecs:service:DesiredCount \ --policy-type TargetTrackingScaling \ --target-tracking-scaling-policy-configuration file://config.json

Pour de plus amples informations sur les politiques de dimensionnement de suivi de cible, veuillez consulter Politiques de dimensionnement de suivi de cible dans le Manuel de l'utilisateur Application Auto Scaling.