Política de escalado basada en Amazon SQS - Amazon EC2 Auto Scaling

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Política de escalado basada en Amazon SQS

importante

La información y los pasos siguientes te muestran cómo calcular la acumulación de SQS colas de Amazon por instancia mediante el atributo ApproximateNumberOfMessages queue antes de publicarlo como una métrica personalizada en. CloudWatch Sin embargo, ahora puede ahorrar el costo y el esfuerzo dedicados a publicar su propia métrica mediante la calculadora de métricas. Para obtener más información, consulte Cree una política de escalado de seguimiento de objetivos utilizando la matemática métrica.

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 (AmazonSQS). Para obtener más información sobre cómo puedes usar AmazonSQS, consulta la Guía para desarrolladores de Amazon Simple Queue Service.

Hay algunos escenarios en los que podrías pensar en escalar en respuesta a la actividad de una SQS cola de Amazon. 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 EC2 instancias de un grupo de Auto Scaling y está configurada para gestionar las tasas de carga habituales. 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 SQS cola 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 escalado automático.

Uso del seguimiento de destino con la métrica correcta

Si utilizas una política de escalado de seguimiento de objetivos basada en una métrica de SQS colas de Amazon personalizada, el escalado dinámico puede ajustarse a la curva de demanda de tu 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 de usar una SQS métrica de CloudWatch Amazon, como ApproximateNumberOfMessagesVisible para el seguimiento de destinos, es que es posible que la cantidad de mensajes de la cola no cambie proporcionalmente al tamaño del grupo de Auto Scaling que procesa los mensajes de la cola. Esto se debe a que la cantidad de mensajes de la SQS cola no define únicamente la cantidad de instancias necesarias. El número de instancias del grupo de escalado automático 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:

  • Acumulación por instancia: para calcular la acumulación por instancia, comienza con el atributo de ApproximateNumberOfMessages cola para determinar la longitud de la SQS cola (cantidad de mensajes disponibles para su recuperación de la cola). Divida ese número por la capacidad de ejecución de la flota, que para un grupo de escalado automático 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, toma el valor de latencia aceptable y divídelo entre el tiempo medio que tarda una EC2 instancia en procesar un mensaje.

Por ejemplo, supongamos que actualmente tiene un grupo de escalado automático con 10 instancias y el número de mensajes visibles en la cola (ApproximateNumberOfMessages) es 1500. 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 mensajes. Esto significa que 100 es el valor de destino para su política de seguimiento de destino. Cuando la lista de tareas pendientes por instancia alcance el valor objetivo, se producirá un evento de escalado horizontal. Si la lista de tareas pendientes por instancia se encuentra actualmente en 150 (1500/10 instancias), su grupo se escala horizontalmente en 5 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 escalado automático para que el escalado se realice en función de estos cálculos.

importante

Recuerde que, para reducir los costos, puede utilizar la calculadora de métricas. Para obtener más información, consulte Cree una política de escalado de seguimiento de objetivos utilizando la matemática métrica.

Existen tres puntos principales para esta configuración:

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

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

  • Una política de seguimiento de objetivos que configura su grupo de Auto Scaling para que escale en función de la métrica personalizada y un valor objetivo establecido. CloudWatch las alarmas invocan la política de escalado.

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

Diagrama de arquitectura EC2 de Amazon Auto Scaling mediante colas

Limitaciones y requisitos previos

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

  • Debe usar el AWS CLI o un SDK para publicar su métrica personalizada. CloudWatch A continuación, puede supervisar su métrica con AWS Management Console.

  • La consola Amazon EC2 Auto Scaling no admite políticas de escalado de seguimiento de objetivos que utilicen métricas personalizadas. Debe usar la AWS CLI o una SDK para especificar una métrica personalizada para su política de escalado.

Las siguientes secciones le indican cómo AWS CLI utilizarla para las tareas que debe realizar. Por ejemplo, para obtener datos métricos que reflejen el uso actual de la cola, utilice el SQS get-queue-attributescomando. Asegúrese de que lo tiene CLI instalado y configurado.

Antes de empezar, debes tener una SQS cola de Amazon para poder utilizarla. En las siguientes secciones se asume que ya tiene una cola (estándar oFIFO), un grupo de Auto Scaling e EC2 instancias que ejecutan la aplicación que usa la cola. Para obtener más información sobre AmazonSQS, consulta la Guía para desarrolladores de Amazon Simple Queue Service.

Amazon SQS y la protección escalable de instancias

Los mensajes que no se hayan procesado en el momento en que se cierra una instancia se devuelven a la SQS cola, donde pueden ser procesados por otra instancia que aún esté en ejecución. 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 escalado automático 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 Diseñe sus aplicaciones de manera que gestionen la terminación de instancias de forma adecuada.