Construcción de mensajería Pub/Sub con Amazon SNS - Patrones de fan-out y filtrado

Explicamos la mensajería basada en temas con SNS, los filtros de suscripción y el patrón de fan-out con SQS para construir arquitecturas desacopladas.

Descripción general de SNS

SNS es un servicio de mensajería Pub/Sub que soporta hasta 12.5 millones de suscripciones por tema, con un tamaño máximo de mensaje de 256 KB. Los publicadores envían mensajes a un tema y estos se entregan a todos los suscriptores del mismo. Mientras SQS proporciona colas punto a punto, SNS habilita fan-out de uno a muchos. Los temas Standard entregan con ordenamiento de mejor esfuerzo a un rendimiento prácticamente ilimitado, mientras que los temas FIFO proporcionan garantías estrictas de orden y deduplicación a 300 mensajes por segundo (3,000 con procesamiento por lotes). Los protocolos de suscripción incluyen SQS, Lambda, HTTP/S, Email, SMS y Kinesis Data Firehose, permitiendo la entrega simultánea a múltiples suscriptores con diferentes protocolos desde un solo tema.

Fan-out y filtrado

En el patrón de fan-out SNS + SQS, múltiples colas SQS se suscriben a un tema SNS, permitiendo que un mensaje se entregue a múltiples consumidores en paralelo. Un ejemplo típico es distribuir un evento de pedido simultáneamente a una cola de gestión de inventario, una cola de envío y una cola de notificaciones. Las políticas de filtro de suscripción filtran según atributos de mensaje para que cada suscriptor reciba solo los mensajes necesarios. Las políticas de filtro pueden aplicarse a MessageAttributes (predeterminado) o MessageBody, y soportan condiciones compuestas que combinan coincidencia exacta de cadenas, coincidencia de prefijo, rango numérico y el operador exists. Los temas FIFO controlan el orden mediante IDs de grupo de mensajes; los mensajes dentro del mismo grupo se entregan en estricto orden FIFO. Los diferentes grupos se entregan de forma independiente en paralelo, permitiendo diseños que garantizan el orden solo donde es necesario mientras mantienen el rendimiento.

Colas de mensajes no entregados y reintentos

Configurar una cola de mensajes no entregados (DLQ) en una suscripción SNS redirige los mensajes con entrega fallida a una cola SQS para inspección posterior. Para entregas a endpoints HTTP/S, las políticas de reintento controlan el número y los intervalos. Los reintentos de entrega HTTP/S ocurren en 3 fases: reintento inmediato (1 intento), fase de backoff (10 intentos con backoff exponencial) y fase post-backoff (38 intentos a intervalos de 20 segundos) para un total de 49 reintentos. Las suscripciones Lambda siguen la política de reintento de invocación asíncrona de Lambda. Los logs de estado de entrega se pueden enviar a CloudWatch Logs para analizar tasas de éxito y causas de error. Los logs soportan tasas de muestreo separadas para éxito y fallo; es práctica común mantener el muestreo de logs exitosos alrededor del 10% para gestión de costos. El acceso a temas entre cuentas se controla mediante políticas basadas en recursos. Para profundizar en los patrones de mensajería, libros especializados (Amazon) son una referencia útil.

Mejores prácticas de diseño y errores comunes

El diseño de atributos de mensaje impacta directamente en la eficiencia del filtrado. Se recomienda incluir los atributos usados para filtrado en MessageAttributes para que los suscriptores no necesiten parsear el cuerpo del payload. Los temas Standard pueden entregar mensajes más de una vez (al menos una vez), por lo que los consumidores deben garantizar idempotencia. Para payloads de mensajes grandes (más de 256 KB), use el patrón Extended Client Library: almacene el payload en S3 e incluya solo la referencia S3 en el mensaje SNS. En temas FIFO, el diseño del MessageDeduplicationId es crítico; al habilitar la deduplicación basada en contenido se usa un hash del cuerpo para detección automática, pero tenga cuidado con la deduplicación no intencionada. Hay dos opciones de cifrado: SSE-SNS (clave gestionada por AWS) y SSE-KMS (CMK). Para escenarios entre cuentas, la política de clave CMK debe otorgar permisos de descifrado a la cuenta de destino.

Elegir entre SNS y EventBridge

SNS y EventBridge son ambos fundamentos para arquitecturas dirigidas por eventos pero sirven a dominios diferentes. SNS es adecuado para escenarios de alto rendimiento (prácticamente ilimitado con temas Standard) donde el filtrado simple de atributos es suficiente. EventBridge es adecuado para escenarios que requieren coincidencia avanzada de patrones en la estructura del evento (campos arbitrarios en el cuerpo JSON), disparadores programados o integraciones SaaS (Shopify, Zendesk, etc.). En cuanto a precios, la entrega de SNS a SQS es gratuita mientras que EventBridge cobra por evento, haciendo que SNS sea más económico para cargas de trabajo Pub/Sub puras que distribuyen el mismo evento a muchos objetivos. Por el contrario, para casos con pocas reglas que realizan enrutamiento complejo, el diseño basado en reglas de EventBridge ofrece mejor mantenibilidad. Combinar ambos - enrutar con EventBridge y luego distribuir con SNS - también es una arquitectura efectiva.

Gestión de costos de SNS

Los costos de SNS están determinados por el número de publicaciones y el protocolo de entrega. Las entregas a SQS son gratuitas, lo que hace que el patrón SNS a SQS a Lambda sea potencialmente más económico que la entrega directa de SNS a Lambda. Las entregas HTTP/S cuestan 0.06 USD por 100,000, y los costos de SMS varían significativamente por país de destino (0.00645 USD/mensaje para EE.UU., 0.07086 USD/mensaje para Japón). El filtrado de mensajes reduce entregas innecesarias y optimiza las invocaciones de Lambda. Para mensajería de alto volumen, agrupar múltiples eventos en un solo mensaje puede reducir el número total de publicaciones. Los temas FIFO cuestan el doble que Standard (0.50 USD por millón de solicitudes), así que use temas Standard para las partes que no requieren garantías de orden para controlar costos.

Resumen

SNS es un servicio que habilita patrones de fan-out mediante mensajería Pub/Sub. Los filtros de suscripción proporcionan enrutamiento eficiente basado en atributos, y las DLQ capturan de forma confiable los mensajes con entrega fallida. Como las entregas a SQS son gratuitas, el patrón SNS a SQS a Lambda ofrece procesamiento asíncrono eficiente en costos, con temas FIFO aplicando garantías de orden solo donde es necesario. Eligiendo apropiadamente entre SNS y EventBridge según los requisitos de rendimiento y la complejidad del enrutamiento, se pueden diseñar arquitecturas dirigidas por eventos óptimas.