Servicio de colas de mensajes completamente administrado de AWS que desacopla componentes de aplicaciones distribuidas, garantizando la entrega de mensajes con escalabilidad ilimitada.
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.
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:
| Aspecto | Standard | FIFO |
|---|---|---|
| Throughput | Ilimitado | 300 msg/s (sin batching), 3,000 msg/s (con batching) |
| Orden | Best-effort | Estrictamente preservado |
| Deduplicación | At-least-once delivery | Exactly-once processing |
| Costo | $0.40 por millón de requests | $0.50 por millón de requests |
| Latencia | Menor | Ligeramente mayor |
| Casos de uso | Logs, métricas, notificaciones | Transacciones financieras, comandos de estado |
Marco de decisión:
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
passReglas de tuning:
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"]
}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.QueueNameEstrategia de redrive:
StartMessageMoveTaskPara 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 0SQS 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.
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.
Patrón arquitectónico donde los componentes se comunican mediante eventos asíncronos, permitiendo sistemas desacoplados, escalables y reactivos.
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.
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.
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.
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.