Jonatan Matajonmatum.com
conceptosnotasexperimentosensayos
© 2026 Jonatan Mata. All rights reserved.v2.1.1
Conceptos

AWS SQS

Servicio de colas de mensajes completamente administrado de AWS que desacopla componentes de aplicaciones distribuidas, garantizando la entrega de mensajes con escalabilidad ilimitada.

evergreen#aws#sqs#messaging#queue#serverless#decoupling

¿Qué es?

Amazon SQS (Simple Queue Service) es un servicio de colas de mensajes completamente administrado que permite desacoplar y escalar microservicios, sistemas distribuidos y aplicaciones serverless. A diferencia de la comunicación síncrona directa, SQS actúa como un buffer duradero entre productores y consumidores, garantizando que los mensajes se entreguen al menos una vez y permanezcan disponibles hasta ser procesados exitosamente.

SQS maneja automáticamente la infraestructura subyacente, incluyendo replicación, cifrado en tránsito y en reposo, y escalado dinámico. Los mensajes pueden contener hasta 256 KB de datos de texto en cualquier formato, y el servicio puede manejar prácticamente cualquier volumen de tráfico sin configuración previa de capacidad.

El servicio se integra nativamente con otros servicios de AWS como AWS Lambda, AWS SNS, y AWS Step Functions, siendo un componente fundamental en arquitecturas event-driven.

Tipos de cola: Standard vs FIFO

La elección entre colas Standard y FIFO es una decisión arquitectónica crítica que impacta rendimiento, costo y garantías de entrega:

AspectoStandardFIFO
ThroughputIlimitado300 msg/s (sin batching), 3,000 msg/s (con batching)
OrdenBest-effortEstrictamente preservado
DeduplicaciónAt-least-once deliveryExactly-once processing
Costo$0.40 por millón de requests$0.50 por millón de requests
LatenciaMenorLigeramente mayor
Casos de usoLogs, métricas, notificacionesTransacciones financieras, comandos de estado

Marco de decisión:

  • Usa Standard cuando el throughput es crítico y puedes manejar duplicados o procesamiento fuera de orden
  • Usa FIFO cuando el orden es esencial y no puedes tolerar duplicados (ej: actualizaciones de inventario, procesamiento de pagos)

Configuración de visibility timeout

El visibility timeout es crucial para el rendimiento y la confiabilidad. Cuando un consumidor recibe un mensaje, este se vuelve invisible para otros consumidores durante este período:

import boto3
import json
 
def lambda_handler(event, context):
    sqs = boto3.client('sqs')
    queue_url = 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue'
    
    # Recibir mensajes con visibility timeout optimizado
    response = sqs.receive_message(
        QueueUrl=queue_url,
        MaxNumberOfMessages=10,  # Batch processing
        VisibilityTimeoutSeconds=300,  # 5 minutos para procesamiento
        WaitTimeSeconds=20  # Long polling
    )
    
    messages = response.get('Messages', [])
    
    for message in messages:
        try:
            # Procesar mensaje
            body = json.loads(message['Body'])
            process_business_logic(body)
            
            # Eliminar mensaje exitoso
            sqs.delete_message(
                QueueUrl=queue_url,
                ReceiptHandle=message['ReceiptHandle']
            )
            
        except Exception as e:
            # Extender visibility timeout si necesitas más tiempo
            sqs.change_message_visibility(
                QueueUrl=queue_url,
                ReceiptHandle=message['ReceiptHandle'],
                VisibilityTimeoutSeconds=600  # Extender a 10 minutos
            )
            
            print(f"Error processing message: {e}")
            # El mensaje volverá a estar disponible automáticamente
 
def process_business_logic(data):
    # Lógica de negocio que puede tomar varios minutos
    pass

Reglas de tuning:

  • Visibility timeout = tiempo máximo de procesamiento + buffer del 20%
  • Para Lambda: típicamente 30-300 segundos
  • Para procesos largos: hasta 12 horas (máximo de SQS)

Patrones de procesamiento por lotes

SQS soporta procesamiento por lotes para optimizar throughput y reducir costos:

# Consumidor Lambda optimizado para batches
def lambda_handler(event, context):
    # Lambda puede recibir hasta 10 mensajes por invocación
    processed = 0
    failed = 0
    
    for record in event['Records']:
        try:
            message_body = json.loads(record['body'])
            process_message(message_body)
            processed += 1
        except Exception as e:
            failed += 1
            # Lambda automáticamente reintenta mensajes fallidos
            print(f"Failed to process message: {e}")
    
    # Métricas para observabilidad
    print(f"Processed: {processed}, Failed: {failed}")
    
    # Si hay fallos, Lambda reintentará automáticamente
    if failed > 0:
        raise Exception(f"Failed to process {failed} messages")
 
# Configuración de Lambda trigger
{
    "BatchSize": 10,
    "MaximumBatchingWindowInSeconds": 5,
    "FunctionResponseTypes": ["ReportBatchItemFailures"]
}

Dead Letter Queues y estrategias de redrive

Las DLQ son esenciales para manejar mensajes que fallan repetidamente:

# CloudFormation template para DLQ
Resources:
  MainQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: orders-processing
      VisibilityTimeoutSeconds: 300
      RedrivePolicy:
        deadLetterTargetArn: !GetAtt DeadLetterQueue.Arn
        maxReceiveCount: 3
      
  DeadLetterQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: orders-processing-dlq
      MessageRetentionPeriod: 1209600  # 14 días
      
  # Alarma para monitorear DLQ
  DLQAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: orders-dlq-messages
      MetricName: ApproximateNumberOfVisibleMessages
      Namespace: AWS/SQS
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 1
      Threshold: 1
      ComparisonOperator: GreaterThanOrEqualToThreshold
      Dimensions:
        - Name: QueueName
          Value: !GetAtt DeadLetterQueue.QueueName

Estrategia de redrive:

  1. Análisis: examinar mensajes en DLQ para identificar patrones de fallo
  2. Corrección: arreglar bugs en el código consumidor
  3. Redrive: mover mensajes de vuelta a la cola principal usando StartMessageMoveTask
  4. Monitoreo: configurar alertas para detectar nuevos fallos rápidamente

Integración con observabilidad

Para sistemas de producción, la observabilidad de SQS es crítica:

import boto3
from aws_lambda_powertools import Logger, Tracer, Metrics
from aws_lambda_powertools.metrics import MetricUnit
 
logger = Logger()
tracer = Tracer()
metrics = Metrics()
 
@tracer.capture_lambda_handler
@logger.inject_lambda_context
@metrics.log_metrics
def lambda_handler(event, context):
    queue_depth = get_queue_depth()
    
    # Métricas personalizadas
    metrics.add_metric(name="QueueDepth", unit=MetricUnit.Count, value=queue_depth)
    metrics.add_metric(name="MessagesProcessed", unit=MetricUnit.Count, value=len(event['Records']))
    
    # Logging estructurado
    logger.info("Processing batch", extra={
        "batch_size": len(event['Records']),
        "queue_depth": queue_depth
    })
    
    for record in event['Records']:
        with tracer.subsegment("process_message"):
            process_message_with_tracing(record)
 
def get_queue_depth():
    cloudwatch = boto3.client('cloudwatch')
    response = cloudwatch.get_metric_statistics(
        Namespace='AWS/SQS',
        MetricName='ApproximateNumberOfVisibleMessages',
        Dimensions=[{'Name': 'QueueName', 'Value': 'orders-processing'}],
        StartTime=datetime.utcnow() - timedelta(minutes=5),
        EndTime=datetime.utcnow(),
        Period=300,
        Statistics=['Average']
    )
    return response['Datapoints'][-1]['Average'] if response['Datapoints'] else 0

¿Por qué importa?

SQS es el servicio de mensajería más utilizado en AWS y un componente fundamental para construir sistemas distribuidos resilientes. A nivel de staff engineer, SQS resuelve tres problemas críticos: desacoplamiento temporal (productores y consumidores operan independientemente), absorción de picos (la cola actúa como buffer durante cargas variables), y garantías de entrega (mensajes persisten hasta ser procesados exitosamente).

La elección entre Standard y FIFO impacta directamente la arquitectura del sistema: Standard permite escalado horizontal ilimitado pero requiere lógica idempotente, mientras que FIFO garantiza orden pero limita el throughput. En sistemas de alto volumen, esta decisión puede determinar si necesitas sharding adicional o patrones de procesamiento más complejos.

Para equipos de plataforma, SQS reduce significativamente la complejidad operacional comparado con soluciones auto-administradas como Apache Kafka, eliminando la necesidad de gestionar brokers, particiones, y rebalanceo de consumidores.

Referencias

  • Amazon SQS Developer Guide — AWS, 2024. Guía completa del desarrollador.
  • SQS Best Practices for Performance — AWS, 2024. Optimizaciones de rendimiento y costo.
  • Event-Driven Architectures - Serverless Lens — AWS Well-Architected, 2024. Patrones arquitectónicos para aplicaciones serverless.
  • SQS Pricing and Cost Optimization — AWS, 2024. Modelo de precios detallado.
  • Monitoring Amazon SQS with CloudWatch — AWS, 2024. Métricas y alertas recomendadas.
  • AWS Lambda SQS Integration — AWS, 2024. Configuración y mejores prácticas para triggers.

Contenido relacionado

  • Serverless

    Modelo de computación en la nube donde el proveedor gestiona la infraestructura automáticamente, permitiendo ejecutar código sin aprovisionar ni administrar servidores, pagando solo por el uso real.

  • Arquitectura Orientada a Eventos

    Patrón arquitectónico donde los componentes se comunican mediante eventos asíncronos, permitiendo sistemas desacoplados, escalables y reactivos.

  • AWS Lambda

    Servicio de cómputo serverless de AWS que ejecuta código en respuesta a eventos sin necesidad de aprovisionar ni administrar servidores, escalando automáticamente desde cero hasta miles de ejecuciones concurrentes.

  • AWS SNS

    Servicio de mensajería pub/sub de AWS que distribuye mensajes a múltiples suscriptores simultáneamente, habilitando patrones de fan-out y notificaciones a escala.

  • Observabilidad

    Capacidad de entender el estado interno de un sistema a partir de sus outputs externos: logs, métricas y traces, permitiendo diagnosticar problemas sin acceso directo al sistema.

  • Módulos Terraform para AWS Serverless

    Colección de 13 módulos Terraform publicados en el Terraform Registry para desplegar arquitecturas serverless en AWS, con 12 ejemplos que cubren desde ECS básico hasta CRUD full-stack con DynamoDB y AgentCore con MCP.

Conceptos