Empezamos la séptima entrega de esta serie de post de patrones de arquitectura. Aquí os dejo los artículos anteriores por si os habéis perdido alguno:
- Patrones de arquitectura de microservicios, ¿qué son y qué ventajas nos ofrecen?
- Patrones de arquitectura: organización y estructura de microservicios.
- Patrones de arquitectura: comunicación y coordinación de microservicios.
- Patrones de arquitectura de microservicios: SAGA, API Gateway y Service Discovery.
- Patrones de arquitectura de microservicios: Event Sourcing y arquitectura orientada a eventos (EDA).
- Patrones de arquitectura de microservicios: comunicación y coordinación con CQRS, BFF y Outbox.
En este post veremos un caso de escalabilidad y gestión de recursos: el escalado automático.
En el desarrollo y despliegue de aplicaciones modernas, especialmente aquellas que operan en entornos de nube, la capacidad de escalar recursos de manera eficiente es crucial. El escalado automático es una técnica que permite ajustar automáticamente la cantidad de recursos asignados a una aplicación en función de la demanda actual, asegurando que los recursos sean utilizados de manera óptima y que la aplicación pueda manejar variaciones en la carga de trabajo sin intervención manual.
Esto puede incluir la adición de más instancias de servidor cuando la demanda aumenta o la reducción del número de instancias cuando la demanda disminuye, lo que optimiza el costo y el rendimiento.
Escalado vertical (Scale-Up). Aumentar los recursos (CPU, memoria) de una única instancia de servidor. Esto se hace generalmente agregando más potencia a una máquina existente, suele requerir de acciones manuales e incluso pausa del servicio, por lo que no podemos clasificarlo dentro del escalado automático, pero sí hay que mencionarlo.
Escalado horizontal (Scale-Out, Scale-In). Aumentar el número de instancias de servidor que ejecuta la aplicación. Este es el enfoque más común en la nube debido a su flexibilidad y capacidad para manejar grandes volúmenes de tráfico. También podemos reducir el número de instancias si la demanda se reduce.
- Eficiencia en el uso de recursos: asegura que los recursos se utilicen de manera óptima, reduciendo costos operativos.
- Mejora de la disponibilidad: ayuda a mantener la disponibilidad de la aplicación incluso bajo cargas de trabajo variables y picos de tráfico.
- Optimización del rendimiento: ajusta los recursos para mantener el rendimiento deseado de la aplicación.
- Reducción de intervención manual: minimiza la necesidad de ajustes manuales, permitiendo a los equipos de operaciones enfocarse en tareas más estratégicas.
- Configuración y ajuste de parámetros:
- Umbrales adecuados: definir los umbrales correctos para iniciar el escalado es crítico. Umbrales demasiado bajos pueden desencadenar escalados innecesarios, mientras que umbrales demasiado altos pueden resultar en rendimiento deficiente.
- Políticas de escalado: crear políticas de escalado que se ajusten adecuadamente a las necesidades de la aplicación requiere una comprensión profunda del comportamiento de la carga de trabajo y patrones de tráfico.
- Latencia en el escalado:
- Tiempo de arranque de instancias: puede haber un retraso significativo entre la decisión de escalar y la disponibilidad de nuevos recursos. Por ejemplo, lanzar una nueva instancia de servidor puede tomar varios minutos.
- Impacto temporal en el rendimiento: durante este tiempo de espera, la aplicación puede experimentar una degradación del rendimiento si no hay suficientes recursos disponibles.
- Coste:
- Costes inesperados: si no se configura correctamente, el escalado automático puede resultar en un aumento significativo en los costos operativos debido al aprovisionamiento excesivo de recursos.
- Costes de mantenimiento: monitorizar y ajustar constantemente las políticas de escalado para optimizar costos y rendimiento también puede ser un desafío.
- Complejidad de la configuración:
- Dependencias complejas: las aplicaciones que tienen múltiples servicios y dependencias pueden ser difíciles de escalar adecuadamente. Por ejemplo, escalar un servicio de base de datos puede requerir escalar también los servicios que dependen de él.
- Estrategias de escalado mixto: implementar una combinación de escalado vertical y horizontal puede agregar complejidad a la configuración y gestión de recursos.
- Monitorización y alertas:
- Métricas precisas: la eficacia del escalado automático depende de la precisión de las métricas monitorizadas. Métricas mal configuradas o imprecisas pueden llevar a decisiones de escalado incorrectas
- Alertas relevantes: configurar alertas relevantes para monitorizar el rendimiento y el estado de los recursos escalados es esencial para detectar problemas a tiempo y tomar acciones correctivas.
- Pruebas y validación:
- Pruebas de carga: es necesario realizar pruebas de carga para validar que las políticas de escalado funcionan como se espera bajo diferentes escenarios de tráfico.
- Simulación de escenarios: simular escenarios de picos de tráfico y fallos de recursos ayuda a asegurarse de que el sistema de escalado automático responde adecuadamente.
La implementación del escalado automático generalmente implica el uso de servicios de nube que soportan esta funcionalidad. Los proveedores de nube más comunes, como AWS, Azure y Google Cloud, ofrecen capacidades de escalado automático.
AWS proporciona varias herramientas para el escalado automático, incluyendo:
- Auto Scaling Groups (ASG). Permite definir políticas para añadir o eliminar instancias EC2 basadas en métricas como el uso de CPU, el tráfico de red o métricas personalizadas.
- Elastic Load Balancing (ELB). Distribuye el tráfico de red entre múltiples instancias, asegurando que ninguna instancia se sobrecargue.
- AWS Lambda. Escala automáticamente las funciones sin servidor en respuesta al tráfico de entrada, manejando la ejecución de la función en paralelo según sea necesario.
Ejemplo de configuración de Auto Scaling Group en AWS:
- AutoScalingGroupName: el nombre del grupo de autoescalado.
- LaunchConfigurationName: la configuración de lanzamiento que define cómo se lanzan las instancias EC2.
- MinSize: el número mínimo de instancias en el grupo.
- MaxSize: el número máximo de instancias en el grupo.
- DesiredCapacity: el número inicial de instancias que deseas ejecutar.
- AvailabilityZones: las zonas de disponibilidad en las que las instancias serán lanzadas.
- HealthCheckType: el tipo de chequeo de salud (EC2 en este caso).
- HealthCheckGracePeriod: el periodo de gracia para chequeos de salud.
- Tags: etiquetas aplicadas a las instancias.
- TerminationPolicies: políticas que definen cómo se terminan las instancias (en este caso, se termina la instancia más antigua).
Azure también proporciona capacidades de escalado automático a través de:
- Azure Virtual Machine Scale Sets. Permite crear y administrar un grupo de máquinas virtuales idénticas, ajustando el número de instancias automáticamente.
- Azure App Services. Ofrece escalado automático para aplicaciones web, API y móviles.
- Azure Functions. Escala automáticamente las aplicaciones sin servidor en función de la demanda.
Ejemplo de configuración de Auto Scale en Azure App Services:
- location: ubicación del recurso.
- profiles: define perfiles de escalado.
- name: nombre del perfil.
- capacity: define la capacidad mínima, máxima y por defecto.
- rules: reglas de escalado basadas en métricas.
- metricTrigger: condiciones basadas en métricas (CPU en este caso).
- metricName: nombre de la métrica.
- metricResourceUri: URI del recurso monitorizado.
- timeGrain: frecuencia de muestreo.
- statistic: estadística utilizada (promedio).
- timeWindow: ventana de tiempo para la evaluación.
- timeAggregation: método de agregación.
- operator: operador de comparación.
- threshold: umbral para la acción de escalado.
- scaleAction: acción de escalado.
- direction: dirección del escalado (aumentar o disminuir).
- type: tipo de acción (cambio en el recuento de instancias).
- value: valor de cambio.
- cooldown: periodo de enfriamiento entre acciones.
Google Cloud ofrece capacidades de escalado automático a través de:
- Google Kubernetes Engine (GKE). Escala automáticamente los nodos en un clúster Kubernetes en función de la carga de trabajo.
- Compute Engine Autoscaler. Ajusta el número de instancias de VM en un grupo de instancias manejadas en respuesta a la demanda.
- Google Cloud Functions. Escala automáticamente las funciones sin servidor en función del tráfico de entrada.
Ejemplo de configuración de Auto Scaling en Google Compute Engine
- autoscalingPolicy: define la política de autoescalado.
- minNumReplicas: número mínimo de réplicas.
- maxNumReplicas: número máximo de réplicas.
- coolDownPeriodSec: período de enfriamiento en segundos.
- cpuUtilization: utilización de CPU.
- utilizationTarget: objetivo de utilización (60% en este caso).
Ajusta los recursos en base a patrones de tráfico conocidos o predicciones. Por ejemplo, aumentar la capacidad antes de un evento planificado.
Análisis predictivo
Utilizar análisis predictivos y machine learning para anticipar picos de tráfico y ajustar los umbrales de escalado en consecuencia.
Ejemplo de política de escalado predictivo en AWS:
Este ejemplo es similar al anterior de AWS Auto Scaling Group, pero aplicado en un contexto de escalado predictivo donde se ajustan los recursos en base a patrones de tráfico anticipados. Utiliza las mismas configuraciones básicas pero se basa en análisis predictivos para ajustar los umbrales y desencadenar el escalado.
Ajusta los recursos en respuesta a la demanda actual en tiempo real. Por ejemplo, añadir instancias cuando el uso de CPU supera un umbral predefinido.
Monitorización continua
Monitorizar continuamente el uso de recursos y ajustar dinámicamente los umbrales de escalado basados en el rendimiento en tiempo real.
Configuración de warm pool en AWS:
- warmPool: configuración de un pool de instancias preparadas.
- MinSize: tamaño mínimo del warm pool.
- MaxSize: tamaño máximo del warm pool.
- InstanceReusePolicy: política de reutilización de instancias.
- ReuseOnScaleIn: reutilizar instancias en el escalado hacia adentro.
Ajusta los recursos en horarios específicos basados en patrones de uso predecibles. Por ejemplo, aumentar la capacidad durante el horario laboral y reducirla durante la noche.
Tareas programadas: definir horarios de escalado basados en patrones de tráfico predecibles, como horarios de trabajo o eventos especiales.
Ejemplo de configuración de escalado programado en AWS:
- AutoScalingGroupName: nombre del grupo de autoescalado.
- ScheduledActions: acciones programadas de escalado.
- ScheduledActionName: nombre de la acción programada.
- Recurrence: cronograma para la recurrencia de la acción (en formato cron).
- MinSize: tamaño mínimo durante la acción.
- MaxSize: tamaño máximo durante la acción.
- DesiredCapacity: capacidad deseada durante la acción.
El escalado automático es una técnica esencial para la gestión eficiente de recursos en aplicaciones modernas, especialmente en entornos de nube. A pesar de los desafíos que presenta, como la configuración y ajuste de parámetros, latencia en el escalado y costos, sus beneficios en términos de eficiencia de recursos, mejora de la disponibilidad y optimización del rendimiento lo hacen indispensable.
Las estrategias proactiva, reactiva y programada, junto con ejemplos prácticos en AWS, Azure y Google Cloud, demuestran cómo implementar de manera efectiva el escalado automático para manejar la variabilidad en la carga de trabajo y asegurar que las aplicaciones permanezcan disponibles y eficientes.
¿Quieres seguir leyendo más sobre patrones de arquitectura? Te contamos cómo pasar de monolitos a microservicios, configuración externalizada y Consumer-Driven Contract Testing.
Cuéntanos qué te parece.