Entornos de trabajo de Elastic Beanstalk - AWS Elastic Beanstalk

Entornos de trabajo de Elastic Beanstalk

Si su aplicación de AWS Elastic Beanstalk realiza operaciones o flujos de trabajo que tardan mucho tiempo en completarse, puede trasladar las tareas a un entorno de trabajo dedicado. Desacoplar el front-end de su aplicación web de un proceso que realiza operaciones de bloqueo es una forma habitual de garantizar que su aplicación siga respondiendo cuando está sometida a una carga intensa.

Una tarea de larga ejecución aumenta significativamente el tiempo que se tarda en completar una solicitud, como el procesamiento de imágenes o vídeos, el envío de correo electrónico o la generación de un archivo ZIP. Estas operaciones pueden tardar solamente uno o dos segundos en completarse, pero un retraso de unos segundos es mucho para una solicitud web que de otro modo se completaría en menos de 500 ms.

Una opción consiste en generar un proceso de trabajo localmente y procesar la tarea de forma asíncrona. Esto funcionará si la instancia pueda hacerse cargo de todas las tareas que se le envían. Sin embargo, cuando el nivel de carga es alto, la instancia podría saturarse con tareas en segundo plano y dejar de responder a solicitudes de mayor prioridad. Si los distintos usuarios pueden generar varias tareas, el aumento de la carga podrían no corresponderse a un aumento de los usuarios, por lo que resultará difícil escalar la capa de servidor web de forma eficaz.

Para evitar que se ejecuten tareas de ejecución prolongada localmente, puede utilizar el SDK de AWS para su lenguaje de programación con el fin de enviarlas a una cola de Amazon Simple Queue Service (Amazon SQS) y ejecutar el proceso correspondiente a cada una de ellas en un conjunto separado de instancias. A continuación, diseñe estas instancias de trabajo para obtener los elementos de la cola solo cuando tengan la capacidad de ejecutarlos, lo que evitará que se sobrecarguen.

Los entornos de trabajo de Elastic Beanstalk simplifican este proceso mediante la administración de la cola de Amazon SQS y la ejecución de un proceso daemon en cada instancia que lea de la cola automáticamente. Cuando el daemon obtiene un elemento de la cola, envía una solicitud HTTP POST localmente a http://localhost/ en el puerto 80 con el contenido de la cola en el cuerpo del mensaje. Todo lo que su aplicación tiene que hacer es ejecutar la tarea de larga ejecución en respuesta a la solicitud POST. Puede configurar el daemon para publicar en una ruta diferente, usar un tipo MIME distinto de una aplicación/JSON, conectarse a una cola existente o personalizar las conexiones (solicitudes simultáneas máximas), los tiempos de espera y los reintentos.


      Procesamiento de mensajes de Amazon SQS del entorno de trabajo de Elastic Beanstalk

Con las tareas periódicas, también puede configurar el daemon de trabajo para que ponga en cola los mensajes de acuerdo con una programación cron. Cada tarea periódica puede realizar una solicitud POST en una ruta diferente. Habilite las tareas periódicas incluyendo un archivo YAML en el código fuente que defina la programación y la ruta de cada tarea.

nota

La plataforma .NET en Windows Server no admite entornos de trabajo.

El daemon de SQS del entorno de trabajo

Los entornos de trabajo ejecutan un proceso daemon proporcionado por Elastic Beanstalk. Este daemon se actualiza periódicamente para agregar características y corregir errores. Para obtener la versión más reciente del daemon, actualice a la última versión de la plataforma.

Cuando la aplicación en el entorno de trabajo devuelve una respuesta 200 OK para confirmar que ha recibido y procesado correctamente la solicitud, el daemon envía una llamada DeleteMessage a la cola de Amazon SQS para que el mensaje se elimine de la cola. Si la aplicación devuelve una respuesta distinta a 200 OK, Elastic Beanstalk espera el periodo especificado en ErrorVisibilityTimeout para volver a poner el mensaje en la cola. Si no hay respuesta, Elastic Beanstalk espera el periodo especificado en InactivityTimeout para volver a poner el mensaje en la cola, de forma que el mensaje esté disponible para otro intento durante el procesamiento.

nota

Las propiedades de las colas de Amazon SQS (orden de los mensajes, entrega al menos una vez y muestreo de mensajes) pueden afectar al modo en que diseña una aplicación web para un entorno de trabajo. Para obtener más información, consulte Propiedades de colas distribuidas en la Guía para desarrolladores de Amazon Simple Queue Service.

Amazon SQS elimina automáticamente los mensajes que llevan en la cola más tiempo que el valor especificado en RetentionPeriod.

El daemon establece los siguientes encabezados HTTP.

Encabezados HTTP

Nombre Valor

User-Agent

aws-sqsd

aws-sqsd/1.11

X-Aws-Sqsd-Msgid

ID de mensaje de SQS, que se utiliza para detectar tormentas de mensajes (un número inusualmente elevado de mensajes nuevos).

X-Aws-Sqsd-Queue

Nombre de la cola de SQS.

X-Aws-Sqsd-First-Received-At

Hora UTC, en formato ISO 8601, a la que se recibió por primera vez el mensaje.

X-Aws-Sqsd-Receive-Count

Número de recepción de mensajes de SQS.

X-Aws-Sqsd-Attr-message-attribute-name

Atributos de mensajes personalizados asignados al mensaje que se está procesando. message-attribute-name es el nombre del atributo del mensaje real. Todos los atributos de mensajes de cadena y número se añaden al encabezado. Los atributos binarios se descartan y no se incluyen en el encabezado.

Content-Type

Configuración de tipo MIME; application/json, de forma predeterminada.

Colas de mensajes fallidos

Los entornos de trabajo de Elastic Beanstalk admiten las colas de mensajes fallidos de Amazon Simple Queue Service (Amazon SQS). Una cola de mensajes fallidos es una cola en la que otras colas pueden enviar mensajes que por algún motivo no se pudieron procesar correctamente. Una de las ventajas principales de usar una cola de mensajes fallidos es la capacidad de identificar y aislar los mensajes procesados sin éxito. A continuación, puede analizar los mensajes enviados a la cola de mensajes fallidos para intentar determinar por qué no se han procesado correctamente.

Si especifica una cola de Amazon SQS generada automáticamente en el momento de crear la capa del entorno de trabajo, se habilita de forma predeterminada una cola de mensajes fallidos para un entorno de trabajo. Si elige una cola de SQS existente para su entorno de trabajo, debe utilizar SQS para configurar una cola de mensajes fallidos de manera independiente. Para obtener información sobre cómo utilizar SQS para configurar una cola de mensajes fallidos, consulte Colas de mensajes fallidos de Amazon SQS.

No puede deshabilitar las colas de mensajes fallidos. Los mensajes que no se puedan entregar siempre se envían a una cola de mensajes fallidos. No obstante, puede desactivar esta funcionalidad de forma eficaz estableciendo la opción MaxRetries en el valor válido máximo de 100.

Si no se ha configurado una cola de mensajes fallidos para la cola de Amazon SQS de su entorno de trabajo, Amazon SQS mantiene los mensajes en la cola hasta que expira el período de retención. Para obtener información detallada sobre la configuración del período de retención, consulte Configuración de entornos de trabajo.

nota

La opción MaxRetries de Elastic Beanstalk es equivalente a la opción MaxReceiveCount de SQS. Si el entorno de trabajo no utiliza una cola de SQS generada automáticamente, use la opción MaxReceiveCount de SQS para desactivar de forma eficaz su cola de mensajes fallidos. Para obtener más información, consulte Uso de colas de mensajes fallidos de Amazon SQS.

Para obtener más información sobre el ciclo de vida de un mensaje de SQS, consulte Message Lifecycle (Ciclo de vida del mensaje).

Tareas periódicas

Puede definir tareas periódicas en un archivo denominado cron.yaml en su paquete de código fuente para añadir automáticamente trabajos a la cola del entorno de trabajo a intervalos regulares.

Por ejemplo, el siguiente archivo cron.yaml crea dos tareas periódicas. La primera se ejecuta cada 12 horas y la segunda a las 11 p. m. UTC todos los días.

ejemplo cron.yaml

version: 1 cron: - name: "backup-job" url: "/backup" schedule: "0 */12 * * *" - name: "audit" url: "/audit" schedule: "0 23 * * *"

El name debe ser único para cada tarea. La dirección URL es la ruta a la que se envía la solicitud POST para desencadenar el trabajo. La programación es una expresión CRON que determina cuándo se ejecuta la tarea.

Cuando se ejecuta una tarea, el daemon publica un mensaje en la cola de SQS del entorno con un encabezado que indica el trabajo que debe realizarse. Cualquier instancia del entorno puede obtener el mensaje y procesar el trabajo.

nota

Si configura su entorno de trabajo con una cola de SQS existente y elige una cola FIFO de Amazon SQS, las tareas periódicas no serán compatibles.

Elastic Beanstalk usa la funcionalidad de elección de líder para determinar qué instancia de su entorno de trabajo pone en cola la tarea periódica. Cada instancia intenta convertirse en líder escribiendo en una tabla de Amazon DynamoDB. La primera instancia que lo logra es el líder y debe seguir escribir en la tabla para mantener el estado de líder. Si el líder se queda fuera de servicio, otra instancia ocupa su lugar rápidamente.

Para las tareas periódicas, el daemon de trabajo establece los siguientes encabezados adicionales.

Encabezados HTTP

Nombre Valor

X-Aws-Sqsd-Taskname

Para las tareas periódicas, el nombre de la tarea que se va a realizar.

X-Aws-Sqsd-Scheduled-At

Momento en el que programó la tarea periódica

X-Aws-Sqsd-Sender-Id

Número de cuenta de AWS del remitente del mensaje

Uso de Amazon CloudWatch para el escalado automático en capas del entorno de trabajo

Juntos, Auto Scaling de Amazon EC2 y CloudWatch monitorizan el uso de la CPU de las instancias en ejecución en el entorno de trabajo. El modo en que configura el límite de escalado automático para la capacidad de la CPU determina el número de instancias que el grupo de Auto Scaling ejecuta para administrar correctamente el desempeño de los mensajes en la cola de Amazon SQS. Cada instancia EC2 publica sus métricas de utilización de la CPU en CloudWatch. Auto Scaling de Amazon EC2 recupera de CloudWatch el uso medio de la CPU de todas las instancias del entorno de trabajo. Debe configurar el umbral superior e inferior, así como el número de instancias que se añaden o terminan de acuerdo con la capacidad de la CPU. Cuando Auto Scaling de Amazon EC2 detecta que se ha alcanzado el umbral superior especificado para la capacidad de la CPU, Elastic Beanstalk crea nuevas instancias en el entorno de trabajo. Las instancias se eliminan cuando la carga de la CPU cae por debajo del umbral.

nota

Los mensajes que no se procesaron cuando se terminó la instancia se devuelven a la cola, donde pueden ser procesados por otro daemon de la instancia que siga ejecutándose.

También puede configurar otras alarmas de CloudWatch, según sea necesario, mediante la consola de Elastic Beanstalk, la CLI o el archivo de opciones. Para obtener más información, consulte Uso de Elastic Beanstalk con Amazon CloudWatch y Crear un grupo de Auto Scaling con políticas de escalado por pasos.

Configuración de entornos de trabajo

Puede administrar la configuración de un entorno de trabajo editando la categoría Worker (Entorno de trabajo) en la página Configuration (Configuración) de la consola de administración del entorno.


        Página de configuración Modify worker (Modificar entorno de trabajo) en la consola de Elastic Beanstalk
nota

Puede configurar la ruta de URL para enviar los mensajes de cola de proceso de trabajo, pero no puede configurar el puerto IP. Elastic Beanstalk siempre publica mensajes de cola de entorno de trabajo en el puerto 80. La aplicación de entorno de proceso de trabajo o su proxy deben escuchar en el puerto 80.

Para configurar el daemon del entorno de trabajo

  1. Abra la consola de Elastic Beanstalk y, en la lista Regions (Regiones), seleccione su región de AWS.

  2. En el panel de navegación, elija Environments (Entornos) y, a continuación, elija el nombre del entorno en la lista.

    nota

    Si tiene muchos entornos, utilice la barra de búsqueda para filtrar la lista de entornos.

  3. En el panel de navegación, elija Configuration (Configuración).

  4. En la categoría de configuración del Worker (Entorno de trabajo) elija Edit (Editar).

La página Modify worker (Modificar configuración del entorno de trabajo) tiene las siguientes opciones.

En la sección Queue (Cola):

  • Worker queue (Cola de entorno de trabajo): especifique la cola de Amazon SQS de la que lee el daemon. Si dispone de una, puede elegir una cola existente. Si elige Autogenerated queue (Cola generada automáticamente), Elastic Beanstalk crea una nueva cola de Amazon SQS y una URL de cola de entorno de trabajocorrespondiente.

    nota

    Al elegir Autogenerated queue (Cola generada automáticamente), la cola que crea Elastic Beanstalk es una cola de Amazon SQS estándar. Cuando elija una cola existente, puede proporcionar una cola estándar o una cola FIFO de Amazon SQS. Tenga en cuenta que, si proporciona una cola FIFO, las tareas periódicas no serán compatibles.

  • Worker queue URL (URL de cola de entorno de trabajo): si elige una cola de entorno de trabajo existente, esta opción muestra la URL asociada a esa cola de Amazon SQS.

En la sección Messages (Mensajes) :

  • HTTP path (Ruta HTTP): especifique la rula relativa a la aplicación que recibirá los datos de la cola de Amazon SQS. Los datos se insertan en el cuerpo de un mensaje HTTP POST. El valor predeterminado es /.

  • MIME type (Tipo MIME): indique el tipo MIME que usa el mensaje HTTP POST. El valor predeterminado es application/json. Sin embargo, cualquier valor es válido, ya que puede crear y después especificar su propio tipo MIME.

  • HTTP connections (Conexiones HTTP): especifique el número máximo de conexiones simultáneas que el daemon puede realizar en cualquier aplicación dentro de una instancia de Amazon EC2. El valor predeterminado es 50. Puede especificar de 1 a 100.

  • Visibility timeout (Tiempo de espera de visibilidad): indique la cantidad de tiempo, en segundos, durante la que se bloquea el procesamiento de un mensaje entrante procedente de la cola de Amazon SQS. Una vez transcurrido el período de tiempo configurado, el mensaje vuelve a hacerse visible en la cola para que cualquier otro daemon pueda leerlo. Elija un valor superior al que necesita su aplicación para procesar mensajes, hasta 43200 segundos.

  • Error visibility timeout (Tiempo de espera de visibilidad del error): indique la cantidad de tiempo, en segundos, que transcurre antes de que Elastic Beanstalk devuelva un mensaje a la cola de Amazon SQS cuando se produce un error explícito en un intento de procesamiento. Puede especificar de 0 a 43200 segundos.

En la sección Advanced options (Opciones avanzadas):

  • Max retries (Número máximo de reintentos): especifique el número máximo de veces que Elastic Beanstalk intenta enviar el mensaje a la cola de Amazon SQS antes de mover el mensaje a la cola de mensajes fallidos. El valor predeterminado es 10. Puede especificar de 1 a 100.

    nota

    La opción Max retries (Número máximo de reintentos) no se aplica si las colas de Amazon SQS de su entorno de trabajo no tienen una cola de mensajes fallidos configurada. En tal caso, Amazon SQS retiene los mensajes en la cola y los procesa hasta que expira el periodo especificado por la opción Retention period (Período de retención).

  • Connection timeout (Tiempo de espera de la conexión): indique la cantidad de tiempo, en segundos, que se va a esperar a que las conexiones con una aplicación se realicen correctamente. El valor predeterminado es 5. Puede especificar de 1 a 60 segundos.

  • Inactivity timeout (Tiempo de espera de inactividad): indique la cantidad de tiempo, en segundos, que se debe a esperar para que llegue la respuesta de una conexión existente con una aplicación. El valor predeterminado es 180. Puede especificar de 1 a 36000 segundos.

  • Retention period (Período de retención): indique la cantidad de tiempo, en segundos, durante la que un mensaje es válido y se procesa de forma activa. El valor predeterminado es 345600. Puede especificar de 60 a 1209600 segundos.

Si utiliza una cola de Amazon SQS existente, los valores que configura al crear un entorno de trabajo pueden entrar en conflicto con los valores establecidos directamente en Amazon SQS. Por ejemplo, si configura un entorno de trabajo con un valor de RetentionPeriod mayor que el valor de MessageRetentionPeriod definido en Amazon SQS, Amazon SQS eliminará el mensaje cuando supere el valor de MessageRetentionPeriod.

Asimismo, si el valor de RetentionPeriod que establece en la configuración del entorno de trabajo es menor que el valor de MessageRetentionPeriod definido en Amazon SQS, el daemon eliminará el mensaje antes que Amazon SQS. En VisibilityTimeout, el valor que establece para el daemon en la configuración del entorno de trabajo anula el valor de VisibilityTimeout de Amazon SQS. Asegúrese de que los mensajes se eliminan adecuadamente comparando la configuración de Elastic Beanstalk con la configuración de Amazon SQS.