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:

  1. Patrones de arquitectura de microservicios, ¿qué son y qué ventajas nos ofrecen?
  2. Patrones de arquitectura: organización y estructura de microservicios.
  3. Patrones de arquitectura: comunicación y coordinación de microservicios.
  4. Patrones de arquitectura de microservicios: SAGA, API Gateway y Service Discovery.
  5. Patrones de arquitectura de microservicios: Event Sourcing y arquitectura orientada a eventos (EDA).
  6. 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.

Concepto de 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.

Tipos de escalado

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.

Beneficios del escalado automático

  1. Eficiencia en el uso de recursos: asegura que los recursos se utilicen de manera óptima, reduciendo costos operativos.
  2. Mejora de la disponibilidad: ayuda a mantener la disponibilidad de la aplicación incluso bajo cargas de trabajo variables y picos de tráfico.
  3. Optimización del rendimiento: ajusta los recursos para mantener el rendimiento deseado de la aplicación.
  4. 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.

Desafíos del escalado automático

  1. Configuración y ajuste de parámetros:
  1. Latencia en el escalado:
  1. Coste:
  1. Complejidad de la configuración:
  1. Monitorización y alertas:
  1. Pruebas y validación:

Implementación del escalado automático

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 Auto Scaling

AWS proporciona varias herramientas para el escalado automático, incluyendo:

  1. 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.
  2. Elastic Load Balancing (ELB). Distribuye el tráfico de red entre múltiples instancias, asegurando que ninguna instancia se sobrecargue.
  3. 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": "my-auto-scaling-group",
  "LaunchConfigurationName": "my-launch-configuration",
  "MinSize": 1,
  "MaxSize": 10,
  "DesiredCapacity": 2,
  "AvailabilityZones": ["us-west-2a", "us-west-2b"],
  "HealthCheckType": "EC2",
  "HealthCheckGracePeriod": 300,
  "Tags": [
    {
      "Key": "Name",
      "Value": "my-instance",
      "PropagateAtLaunch": true
    }
  ],
  "TerminationPolicies": ["OldestInstance"]
}

Azure Auto Scale

Azure también proporciona capacidades de escalado automático a través de:

  1. 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.
  2. Azure App Services. Ofrece escalado automático para aplicaciones web, API y móviles.
  3. 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": "East US",
  "properties": {
    "profiles": [
      {
        "name": "Profile1",
        "capacity": {
          "minimum": 1,
          "maximum": 10,
          "default": 2
        },
        "rules": [
          {
            "metricTrigger": {
              "metricName": "CpuPercentage",
              "metricResourceUri": "<resource-uri>",
              "timeGrain": "PT1M",
              "statistic": "Average",
              "timeWindow": "PT5M",
              "timeAggregation": "Average",
              "operator": "GreaterThan",
              "threshold": 70
            },
            "scaleAction": {
              "direction": "Increase",
              "type": "ChangeCount",
              "value": "1",
              "cooldown": "PT5M"
            }
          },
          {
            "metricTrigger": {
              "metricName": "CpuPercentage",
              "metricResourceUri": "<resource-uri>",
              "timeGrain": "PT1M",
              "statistic": "Average",
              "timeWindow": "PT5M",
              "timeAggregation": "Average",
              "operator": "LessThan",
              "threshold": 30
            },
            "scaleAction": {
              "direction": "Decrease",
              "type": "ChangeCount",
              "value": "1",
              "cooldown": "PT5M"
            }
          }
        ]
      }
    ]
  }
}

Google Cloud Auto Scaling

Google Cloud ofrece capacidades de escalado automático a través de:

  1. Google Kubernetes Engine (GKE). Escala automáticamente los nodos en un clúster Kubernetes en función de la carga de trabajo.
  2. Compute Engine Autoscaler. Ajusta el número de instancias de VM en un grupo de instancias manejadas en respuesta a la demanda.
  3. 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:
  minNumReplicas: 1
  maxNumReplicas: 10
  coolDownPeriodSec: 60
  cpuUtilization:
    utilizationTarget: 0.6

Estrategias de escalado automático

Escalado proactivo

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:

{
  "AutoScalingGroupName": "my-auto-scaling-group",
  "LaunchConfigurationName": "my-launch-configuration",
  "MinSize": 1,
  "MaxSize": 10,
  "DesiredCapacity": 2,
  "AvailabilityZones": ["us-west-2a", "us-west-2b"],
  "HealthCheckType": "EC2",
  "HealthCheckGracePeriod": 300,
  "Tags": [
    {
      "Key": "Name",
      "Value": "my-instance",
      "PropagateAtLaunch": true
    }
  ],
  "TerminationPolicies": ["OldestInstance"]
}

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.

Escalado reactivo

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:
  MinSize: 2
  MaxSize: 5
  InstanceReusePolicy:
    ReuseOnScaleIn: true

Escalado programado

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": "my-auto-scaling-group",
  "ScheduledActions": [
    {
      "ScheduledActionName": "ScaleUpMorning",
      "Recurrence": "0 8 * * *",
      "MinSize": 5,
      "MaxSize": 15,
      "DesiredCapacity": 10
    },
    {
      "ScheduledActionName": "ScaleDownEvening",
      "Recurrence": "0 18 * * *",
      "MinSize": 1,
      "MaxSize": 5,
      "DesiredCapacity": 2
    }
  ]
}

Conclusió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.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete