Escalado basado en Amazon SQS - Amazon EC2 Auto Scaling

Escalado basado en Amazon SQS

En esta sección se muestra cómo escalar el grupo de Auto Scaling en respuesta a los cambios en la carga del sistema en una cola de Amazon Simple Queue Service (Amazon SQS). Para obtener más información acerca del uso de Amazon SQS, consulte la Guía del desarrollador de Amazon Simple Queue Service.

Hay algunas situaciones en las que es posible que tenga que pensar en la reducción horizontal en respuesta a la actividad en una cola de Amazon SQS. Por ejemplo, supongamos que tiene una aplicación web que permite a los usuarios cargar imágenes y utilizarlas en línea. En este escenario, cada imagen requiere cambiar el tamaño y la codificación antes de poder publicarla. La aplicación se ejecuta en instancias EC2 de un grupo de Auto Scaling y está configurada para administrar las velocidades típicas de carga. Las instancias con error se terminan y se sustituyen para mantener los niveles de instancia actuales en todo momento. La aplicación coloca los datos de mapa de bits sin procesar de las imágenes en una cola de SQS para su procesamiento. Procesa las imágenes y, a continuación, publica las imágenes procesadas donde puedan verlas los usuarios. La arquitectura de este escenario funciona bien si el número de operaciones de carga de imágenes no varía con el tiempo. Sin embargo, si el número de operaciones de carga cambia con el tiempo, podría considerar la posibilidad de utilizar el escalado dinámico para escalar la capacidad del grupo de Auto Scaling.

Uso del seguimiento de destino con la métrica correcta

Si utiliza una política de escalado de seguimiento de destino basada en una métrica de cola de Amazon SQS personalizada, el escalado dinámico puede ajustarse a la curva de demanda de la aplicación de forma más eficaz. Para obtener más información sobre cómo elegir métricas para el seguimiento de destino, consulte Elección de métricas.

El problema con el uso de una métrica de CloudWatch Amazon SQS como ApproximateNumberOfMessagesVisible para el seguimiento de destino es que el número de mensajes en la cola podría no cambiar en la misma proporción que el tamaño del grupo de Auto Scaling que procesa los mensajes de la cola. Eso se debe a que el número de mensajes de su cola de SQS no es el único factor que define el número de instancias necesarias. El número de instancias del grupo de Auto Scaling puede depender de varios factores, como el tiempo que se tarda en procesar un mensaje y la cantidad de latencia (retraso de la cola) aceptable.

La solución es utilizar una métrica de tareas pendientes por instancia con el valor de destino igual a las tareas pendientes aceptables por instancia que desea mantener. Puede calcular estos números como se indica a continuación:

  • Lista de tareas pendientes por instancia: para determinar su lista de tareas pendientes por instancia, comience con el atributo de cola ApproximateNumberOfMessages para determinar la longitud de la cola de SQS (número de mensajes disponibles para recuperación de la cola). Divida ese número por la capacidad de ejecución de la flota, que para un grupo de Auto Scaling es el número de instancias con el estado InService, para obtener las tareas pendientes por instancia.

  • Lista de tareas pendientes aceptables por instancia: para calcular su valor de destino, determine en primer lugar lo que la aplicación puede aceptar en términos de latencia. A continuación, deberá tomar el valor de latencia aceptable y dividirlo por el tiempo medio que una instancia EC2 tarda en procesar un mensaje.

Para ilustrarlo con un ejemplo, el ApproximateNumberOfMessages actual es 1500 y la capacidad de ejecución de la flota es 10. Si el tiempo de procesamiento medio es de 0,1 segundos para cada mensaje y la mayor latencia aceptable es de 10 segundos, el número de tareas pendientes aceptables por instancia es de 10/0,1, que equivale a 100. Esto significa que 100 es el valor de destino para su política de seguimiento de destino. Si la lista de tareas pendientes por instancia se encuentra actualmente en 150 (1500/10), su flota se escala horizontalmente en cinco instancias para mantener la proporción con el valor de destino.

En los procedimientos siguientes se muestra cómo publicar la métrica personalizada y crear la política de escalado de seguimiento de destino que configura el grupo de Auto Scaling para que el escalado se realice en función de estos cálculos.

Existen tres puntos principales para esta configuración:

  • Un grupo de Auto Scaling para administrar las instancias EC2 para procesar mensajes de una cola de SQS.

  • Una métrica personalizada para enviar a Amazon CloudWatch que mide el número de mensajes de la cola por instancia EC2 en el grupo de Auto Scaling.

  • Una política de seguimiento de destino que configure el grupo de Auto Scaling para realizar el escalado basándose en la métrica personalizada y un valor de destino establecido. Las alarmas de CloudWatch invocan la política de escalado.

El siguiente diagrama ilustra la arquitectura de esta configuración.


                        Diagrama de arquitectura de Amazon EC2 Auto Scaling que utiliza colas

Limitaciones y requisitos previos

Para utilizar esta configuración, debe tener en cuenta las siguientes limitaciones:

  • Debe utilizar la AWS CLI o un SDK para publicar su métrica personalizada en CloudWatch. A continuación, puede monitorizar su métrica con la AWS Management Console.

  • Después de publicar la métrica personalizada, debe utilizar la AWS CLI o un SDK para crear una política de escalado de seguimiento de destino con una especificación de métrica personalizada.

Las siguientes secciones explican cómo usar la AWS CLI para las tareas que necesita realizar. Por ejemplo, para obtener datos de métrica que reflejen el uso actual de la cola, utilice el comando get-queue-attributes de SQS. Asegúrese de que ha instalado y configurado la CLI.

Antes de comenzar, debe tener una cola de Amazon SQS que pueda usar. En las siguientes secciones se presupone que ya tiene una cola (estándar o FIFO), un grupo de Auto Scaling e instancias EC2 ejecutándose en la aplicación que utiliza la cola. Para obtener más información sobre Amazon SQS, consulte la Guía del desarrollador de Amazon Simple Queue Service.

Configuración del escalado basada en Amazon SQS

Paso 1: Crear una métrica personalizada de CloudWatch

Una métrica personalizada se define mediante un nombre de métrica y un espacio de nombres de su elección. Los espacios de nombres para métricas personalizadas no pueden comenzar por AWS/. Para obtener más información sobre la publicación de métricas personalizadas, consulte el tema Publicación de métricas personalizadas en la Guía del usuario de Amazon CloudWatch.

Siga este procedimiento para crear la métrica personalizada leyendo primero la información de su cuenta de AWS. A continuación, calcule las tareas pendientes para cada métrica de instancia, tal como se recomienda en una sección anterior. Por último, publique este número en CloudWatch con un nivel de detalle de 1 minuto. Siempre que sea posible, le recomendamos que cuando realizado el escalado basado en métricas, utilice una granularidad de un minuto para garantizar una respuesta más rápida a los cambios en la carga del sistema.

Para crear una métrica personalizada de CloudWatch

  1. Utilice el comando get-queue-attributes de SQS para obtener el número de mensajes en espera en la cola (ApproximateNumberOfMessages).

    aws sqs get-queue-attributes --queue-url https://sqs.region.amazonaws.com/123456789/MyQueue \ --attribute-names ApproximateNumberOfMessages
  2. Utilice el comando describe-auto-scaling-groups para obtener la capacidad de ejecución del grupo, que es el número de instancias que tienen el estado de ciclo de vida InService. Este comando devuelve las instancias de un grupo de Auto Scaling junto con su estado de ciclo de vida.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg
  3. Calcule las tareas pendientes por instancia dividiendo el número aproximado de mensajes disponibles para su recuperación de la cola por la capacidad de ejecución de la flota.

  4. Publique los resultados con un nivel de detalle de 1 minuto como una métrica personalizada de CloudWatch.

    A continuación, se muestra un ejemplo del comando put-metric-data de la CLI.

    aws cloudwatch put-metric-data --metric-name MyBacklogPerInstance --namespace MyNamespace \ --unit None --value 20 --dimensions MyOptionalMetricDimensionName=MyOptionalMetricDimensionValue

Después de que la aplicación emita la métrica deseada, los datos se envían a CloudWatch. La métrica aparece en la consola de CloudWatch. Puede acceder a ella iniciando sesión en la AWS Management Console y desplazándose a la página de CloudWatch. A continuación, puede ver la métrica desplazándose a la página de métricas o buscándola usando el campo de búsqueda. Para obtener información sobre la visualización de métricas, consulte Visualización de las métricas disponibles en la Guía del usuario de Amazon CloudWatch.

Paso 2: Crear una política de escalado de seguimiento de destino

Después de publicar la métrica personalizada, cree una política de escalado de seguimiento de destino con una especificación de métrica personalizada.

Para crear una política de escalado de seguimiento de destino

  1. Utilice el siguiente comando para especificar un valor de destino para su política de escalado en un archivo config.json del directorio principal.

    Para el TargetValue, calcule las tareas pendientes aceptables por cada métrica de instancia e introdúzcala aquí. Para calcular este número, decida un valor de latencia normal y divídalo por el tiempo medio que se tarda en procesar un mensaje.

    $ cat ~/config.json { "TargetValue":100, "CustomizedMetricSpecification":{ "MetricName":"MyBacklogPerInstance", "Namespace":"MyNamespace", "Dimensions":[ { "Name":"MyOptionalMetricDimensionName", "Value":"MyOptionalMetricDimensionValue" } ], "Statistic":"Average", "Unit":"None" } }
  2. Utilice el comando put-scaling-policy, junto con el archivo config.json creado en el paso anterior, para crear su política de escalado.

    aws autoscaling put-scaling-policy --policy-name sqs100-target-tracking-scaling-policy \ --auto-scaling-group-name my-asg --policy-type TargetTrackingScaling \ --target-tracking-configuration file://~/config.json

    Esto crea dos alarmas: una para el escalado ascendente y otra para el escalado descendente. También devuelve el Nombre de recurso de Amazon (ARN) de la política registrada en CloudWatch, que CloudWatch utiliza para invocar el escalado siempre que se interrumpe la métrica.

Paso 3: Prueba de la política de escalado

Una vez que finalice la configuración, verifique que la política de escalado funcione. Puede probarla aumentando el número de mensajes en la cola de SQS y verificando después que el grupo de Auto Scaling ha lanzado una instancia EC2 adicional. También puede probarla reduciendo el número de mensajes en la cola de SQS y verificando después que el grupo de Auto Scaling ha terminado una instancia EC2.

Para probar la función de escalado descendente

  1. Siga los pasos descritos en Tutorial: Envío de un mensaje a una cola de Amazon SQS para agregar mensajes a la cola. Asegúrese de que ha aumentado el número de mensajes en la cola de forma que las tareas pendientes por cada métrica de instancia supere el valor de destino.

    Este proceso puede tardar unos minutos hasta que los cambios desencadenen la alarma de CloudWatch.

  2. Utilice el comando describe-auto-scaling-groups para verificar que el grupo ha lanzado una instancia.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

Para probar la función de escalado descendente

  1. Siga los pasos descritos en Tutorial: Envío de un mensaje a una cola de Amazon SQS para eliminar mensajes de la cola. Asegúrese de que ha disminuido el número de mensajes en la cola de forma que las tareas pendientes por cada métrica de instancia esté por debajo del valor de destino.

    Este proceso puede tardar unos minutos hasta que los cambios desencadenen la alarma de CloudWatch.

  2. Utilice el comando describe-auto-scaling-groups para verificar que el grupo ha terminado una instancia.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name my-asg

Amazon SQS y protección de la reducción horizontal

Los mensajes que no se procesaron cuando se terminó la instancia se devuelven a la cola de SQS, donde pueden ser procesados por otra instancia que siga ejecutándose. Para las aplicaciones en las que se realizan tareas de ejecución prolongada, puede utilizar opcionalmente la protección frente a la reducción horizontal de instancias para tener el control sobre los procesos de trabajo de la cola que se terminan cuando el grupo de Auto Scaling se reduce horizontalmente.

En el siguiente pseudocódigo se muestra una forma de proteger los procesos de trabajo controlados por cola de larga ejecución frente a la terminación por reducción horizontal.

while (true) { SetInstanceProtection(False); Work = GetNextWorkUnit(); SetInstanceProtection(True); ProcessWorkUnit(Work); SetInstanceProtection(False); }

Para obtener más información, consulte Utilización de la protección frente a la reducción horizontal de instancias.