Skip to content
ai

El Serverless es Barato Hasta que Ignoras los Límites de Concurrencia

6 min de lectura
serverless aws lambda concurrencia

También disponible en Inglés

Introducción a los Costos y Límites de Concurrencia en Serverless

El cómputo serverless es una maravilla por su escalabilidad, eficiencia en costos y rapidez de desarrollo… hasta que te encuentras con los límites de concurrencia. Para muchos desarrolladores, la promesa de pagar solo por lo que usas es irresistible, pero la realidad está en los detalles de cómo tus cargas de trabajo escalan en segundo plano. Ya sea que estés implementando APIs, modelos de machine learning o pipelines basados en eventos, los límites de concurrencia pueden transformar rápidamente soluciones económicas en cuellos de botella costosos.

En este artículo, desglosaré cómo funciona la concurrencia en serverless, por qué es importante gestionarla y cómo evitar costos inesperados y problemas de rendimiento.


Puntos Clave

  • Límites de concurrencia: Imponen un tope al número de funciones que pueden ejecutarse simultáneamente. Superarlos genera restricciones o incluso pérdida de solicitudes.
  • Una mala gestión de la concurrencia puede causar costos imprevistos, especialmente con volúmenes altos de solicitudes o funciones de larga duración.
  • Las soluciones incluyen optimizar la duración de las funciones, utilizar arquitecturas basadas en colas y ajustar los valores de concurrencia reservada.
  • AWS Lambda, Azure Functions y Google Cloud Functions tienen comportamientos únicos en cuanto a concurrencia que debes entender antes de desplegar.

¿Qué es la Concurrencia en Serverless?

La concurrencia en computación serverless se refiere al número de instancias de funciones que pueden ejecutarse en paralelo en un momento dado. Por ejemplo, si recibes 500 solicitudes HTTP en un segundo, tu plataforma serverless (como AWS Lambda) intentará iniciar 500 ejecuciones simultáneas. Pero aquí está el problema: las plataformas imponen límites de concurrencia.

¿Cómo Funciona la Concurrencia?

La mayoría de los proveedores serverless definen dos tipos de concurrencia:

  • Concurrencia Predeterminada: Es el número total de invocaciones simultáneas que tu cuenta o función puede manejar. Por ejemplo, AWS Lambda tiene un límite predeterminado de 1,000 ejecuciones concurrentes por región.
  • Concurrencia Reservada: Te permite definir un límite fijo de concurrencia para funciones específicas, asegurando que las cargas críticas siempre tengan recursos disponibles.

Si una función supera estos límites, pueden ocurrir dos cosas:

  1. Restricción (Throttling): Las solicitudes se ponen en cola hasta que la plataforma pueda procesarlas.
  2. Solicitudes Perdidas: Si la cola se llena o expira, las solicitudes fallan.

Un ejemplo sencillo con AWS Lambda:

import json

def lambda_handler(event, context):
    # Simula un proceso de larga duración
    import time
    time.sleep(5)

    return {
        'statusCode': 200,
        'body': json.dumps('¡Hola desde Lambda!')
    }

Si despliegas esta función y recibes 1,000 solicitudes en un segundo, AWS Lambda podrá manejarlas siempre que tengas concurrencia disponible (predeterminado: 1,000). A partir de la solicitud 1,001, esta será restringida o descartada, a menos que hayas ajustado los valores de concurrencia reservada.


¿Por Qué los Límites de Concurrencia Impactan los Costos?

Los límites de concurrencia pueden generar costos ocultos de varias maneras. Aquí un desglose:

Funciones Largas = Costos Más Altos

Las plataformas serverless cobran por invocación y duración. Si tu función toma demasiado tiempo en ejecutarse (por ejemplo, 10 segundos por ejecución) y alcanzas los límites de concurrencia, las solicitudes empiezan a ser restringidas, causando retrasos. Esto puede ralentizar todo el sistema y obligarte a sobreprovisionar concurrencia reservada para manejar los picos de uso.

Cold Starts Aumentan los Costos a Gran Escala

Cada vez que una plataforma serverless crea una nueva instancia de una función, incurres en un “cold start”. Estos aumentan la latencia y la duración de la ejecución. Si operas con alta concurrencia, la acumulación de estos retardos puede impactar considerablemente el rendimiento y la facturación.

Sobreprovisionamiento de Concurrencia Reservada

La concurrencia reservada asegura recursos para funciones críticas, pero tiene un costo. AWS, por ejemplo, te cobra por reservar concurrencia, incluso si no la utilizas. Reservar 500 ejecuciones concurrentes para una función que normalmente usa solo 50 puede resultar en gastos innecesarios.


Cómo Evitar Problemas de Concurrencia

Optimiza la Duración de las Funciones

Funciones más rápidas reducen la probabilidad de alcanzar los límites de concurrencia al liberar recursos con mayor rapidez. Por ejemplo, refactoriza funciones de larga duración para utilizar procesamiento asíncrono o divide lógica monolítica en funciones más pequeñas y enfocadas.

# Antes: Función de larga duración

def process_data(event, context):
    # Procesa 1,000 registros en una sola ejecución
    for record in event['records']:
        process_record(record)
    return "Completado"

# Después: Divide en partes más pequeñas

def process_data(event, context):
    # Procesa 100 registros por ejecución
    for record in event['records'][:100]:
        process_record(record)
    return "Procesamiento parcial completo"

Dividir las tareas en partes más pequeñas reduce el tiempo de ejecución y mejora la concurrencia.

Usa Arquitecturas Basadas en Colas

Si tu carga de trabajo requiere alta concurrencia, considera desacoplarla utilizando un sistema de colas como AWS SQS o Google Pub/Sub. En lugar de procesar miles de solicitudes en paralelo, puedes almacenarlas en una cola y procesarlas de manera incremental.

Ejemplo con SQS:

import boto3

sqs = boto3.client('sqs')
queue_url = 'https://sqs.amazonaws.com/123456789012/MiCola'

def lambda_handler(event, context):
    mensajes = sqs.receive_message(
        QueueUrl=queue_url,
        MaxNumberOfMessages=10
    )

    for mensaje in mensajes['Messages']:
        process_message(mensaje)

    return "Lote procesado"

Monitorea y Ajusta la Concurrencia Reservada

AWS Lambda te permite ajustar la concurrencia reservada en funciones específicas. Usa esta función para aislar cargas críticas y evitar restricciones durante picos de tráfico.

# Ejemplo con AWS CLI
aws lambda put-function-concurrency \
    --function-name MiFuncionCritica \
    --reserved-concurrent-executions 100

¿Qué Pasa con los Modelos de Machine Learning en Serverless?

Las cargas de machine learning son especialmente sensibles a los límites de concurrencia porque suelen involucrar operaciones intensivas en recursos. Por ejemplo, servir un modelo de TensorFlow en AWS Lambda puede ocasionar tiempos de inicio en frío prolongados y alto uso de memoria, exacerbando los problemas de concurrencia.

Estrategias para ML en Serverless

  1. Optimiza el Tamaño del Modelo: Utiliza modelos ligeros como MobileNet o convierte modelos grandes a TensorFlow Lite.
  2. Precarga Modelos: Carga los modelos fuera del manejador de funciones para reducir el tiempo de inicio en frío.
  3. Inferencia por Lotes: En lugar de manejar una predicción por solicitud, agrupa varias solicitudes en una sola invocación de función.

Ejemplo:

import numpy as np

def lambda_handler(event, context):
    # Inferencia por lotes para 10 entradas
    predictions = model.predict(np.array(event['inputs']))
    return predictions.tolist()

Preguntas Frecuentes

¿Qué pasa si supero los límites de concurrencia en serverless?

Cuando superas los límites de concurrencia, las solicitudes pueden ser restringidas (puestas en cola) o descartadas, dependiendo de la plataforma.

¿Cómo puedo monitorear el uso de la concurrencia en serverless?

Usa herramientas de monitoreo de tu proveedor en la nube (como AWS CloudWatch o Azure Monitor) para rastrear métricas como ConcurrentExecutions y Throttles.

¿Es el serverless una buena opción para cargas de trabajo de alta concurrencia?

El serverless puede manejar cargas de trabajo de alta concurrencia, pero es necesario gestionar cuidadosamente los límites de concurrencia y optimizar la duración de las funciones.

¿Puedo aumentar los límites de concurrencia en serverless?

Sí, puedes solicitar límites más altos a los proveedores de la nube como AWS, pero probablemente debas justificarlo con tu caso de uso.

¿Vale la pena la concurrencia reservada?

La concurrencia reservada es útil para garantizar recursos en cargas críticas donde las restricciones o pérdidas de solicitud serían críticas, pero puede ser costosa si se sobredimensiona.


Conclusión

El cómputo serverless es una herramienta poderosa, pero ignorar los límites de concurrencia puede convertir una solución económica en un caos poco fiable. Entendiendo cómo funciona la concurrencia, optimizando tus funciones y adoptando arquitecturas basadas en colas, puedes evitar problemas y aprovechar al máximo las plataformas serverless. Ya sea que estés sirviendo un modelo de ML o gestionando solicitudes HTTP, mantén siempre un ojo en las métricas de concurrencia: tu billetera te lo agradecerá.