Introducción a las Arquitecturas Basadas en Eventos y la Idempotencia
El Auge de las Arquitecturas Basadas en Eventos
Los sistemas modernos de comercio electrónico a menudo dependen de arquitecturas basadas en eventos para garantizar escalabilidad y capacidad de respuesta. Por ejemplo, cuando un usuario realiza un pedido, se activan eventos como “Pedido Realizado”, “Pago Procesado” y “Inventario Actualizado” de manera asíncrona.
Por qué la Idempotencia es Importante en Sistemas Distribuidos
En sistemas distribuidos, los eventos pueden duplicarse o reintentarse debido a fallos de red, lo que lleva a problemas como pedidos duplicados o ajustes de inventario incorrectos. La idempotencia garantiza que procesar un evento varias veces produzca el mismo resultado que procesarlo una vez.
Comprendiendo la Idempotencia
¿Qué es la Idempotencia?
La idempotencia asegura que una operación tenga el mismo efecto sin importar cuántas veces se ejecute. Por ejemplo, si se llama a una API de “Realizar Pedido” dos veces debido a un fallo en la red, solo debería crearse un pedido.
Idempotencia vs. Otros Mecanismos de Tolerancia a Fallos
La idempotencia se centra en la corrección bajo reintentos, mientras que los mecanismos de tolerancia a fallos como los reintentos o interruptores automáticos se ocupan de los fallos, pero pueden no prevenir duplicados.
Desafíos para Lograr la Idempotencia
Causas comunes de eventos duplicados
- Fallas de red: Una puerta de enlace de API como AWS API Gateway podría reintentar una solicitud si la respuesta no se recibe de inmediato.
- Reintentos y retrasos de acuse de recibo: Una pasarela de pago podría reenviar un evento de “Confirmación de pago” si se retrasa el acuse de recibo.
- Productores o consumidores defectuosos: Un microservicio de pago en línea podría emitir eventos duplicados de “Pedido creado” debido a un error en el sistema.
Peligros potenciales sin idempotencia
- Inconsistencias de datos: Procesar eventos duplicados de “Actualización de inventario” puede llevar a niveles de stock incorrectos.
- Fallas en la lógica de negocio: Cobrar dos veces a un cliente por el mismo pedido daña la confianza y crea dificultades con los reembolsos.
Diagrama de flujo del proceso de comercio electrónico
El siguiente diagrama ilustra la secuencia de operaciones e interacciones entre varios componentes de una plataforma de comercio electrónico. Destaca el viaje de un cliente desde la navegación de productos hasta la finalización de una compra y el seguimiento del pedido. Este diagrama generalmente incluye procesos centrales como interacciones de usuarios, flujos de trabajo del sistema backend, procesamiento de pagos, actualizaciones de inventario y mecanismos de entrega. El flujo proporciona una visión holística de cómo interactúan los diversos componentes para ofrecer una experiencia de compra sin fisuras. Además, implementar idempotencia en flujos de trabajo críticos, como el procesamiento de pagos y las actualizaciones de inventario, asegura que el sistema se mantenga confiable y consistente, incluso frente a fallos de red o reintentos. Adoptar algunos servicios de AWS como AWS SQS colas FIFO, DynamoDB y SNS puede simplificar significativamente la implementación de idempotencia en arquitecturas impulsadas por eventos.
Procesos Clave en el Diagrama
1. Navegación y Búsqueda del Usuario
- Los usuarios navegan por el Catálogo de Productos o buscan artículos específicos.
- El backend recupera datos del Servicio del Catálogo de Productos, a menudo almacenados en caché utilizando AWS ElastiCache para obtener resultados más rápidos.
2. Gestión de la Lista de Deseos
- Los usuarios pueden agregar artículos a su lista de deseos.
- Las operaciones son idempotentes para asegurar que el mismo producto no se agregue múltiples veces.
3. Agregar al Carrito y Pagar
- Los productos se añaden al carrito de compras, asegurando ajustes de cantidad idempotentes para prevenir duplicaciones.
- Al realizar el pago, el sistema verifica el contenido del carrito y calcula el precio total.
4. Procesamiento de Pagos
- La pasarela de pago inicia la transacción.
- La idempotencia garantiza que se procese un solo pago incluso si se producen reintentos debido a tiempos de espera de la pasarela.
5. Realización del Pedido
- Tras un pago exitoso, se desencadena un evento de “Pedido Realizado”.
- El sistema crea el registro del pedido, y la idempotencia previene la creación de pedidos duplicados.
6. Actualización de Inventario
- El inventario se ajusta en función del pedido realizado.
- Las actualizaciones idempotentes aseguran que los niveles de stock sean precisos incluso con eventos duplicados o de reintento.
7. Cumplimiento y Entrega del Pedido
- El estado del pedido avanza a través de etapas como “En Proceso”, “Enviado” y “Entregado”.
- Las actualizaciones son idempotentes para evitar cambios de estado incorrectos debido a eventos duplicados.
8. Seguimiento del Pedido y Notificaciones
- Los usuarios pueden verificar el estado de su pedido.
- Las notificaciones (por ejemplo, correo electrónico/SMS) se envían de manera idempotente para evitar enviar spam a los usuarios con duplicados.
Requisitos de Idempotencia
1. Actualizaciones del Carrito
Agregar el mismo producto dos veces debería actualizar la cantidad, no crear entradas duplicadas en el carrito.
- Implementación: Utilice un identificador único de artículo de carrito y una actualización condicional en DynamoDB.
2. Pasarela de Pagos
Los reintentos de pago no deben resultar en cargos duplicados.
- Implementación: Utilice una
Llave de Idempotencia
almacenada en DynamoDB para rastrear transacciones completadas.
3. Colocación de Pedidos
Los eventos duplicados de “Pedido Creado” de un reintentos no deben crear múltiples pedidos.
- Implementación: Utilice un
ID de Pedido
único y una operación condicionalPutItem
en AWS DynamoDB.
4. Actualizaciones de Inventario
Ajustar niveles de stock debe tener en cuenta los reintentos para evitar una sobre-reducción.
- Implementación: Utilice bloqueos distribuidos (por ejemplo, con AWS DynamoDB TTL) para manejar actualizaciones concurrentes.
5. Notificaciones
Las notificaciones por correo electrónico o SMS desencadenadas por un evento deben ser enviadas solo una vez.
- Implementación: Utilice una clave de deduplicación con servicios como Servicio de Notificación Simple de Amazon (SNS).
Conclusión
En sistemas impulsados por eventos, especialmente en plataformas de comercio electrónico y arquitecturas en la nube como AWS, la idempotencia es esencial para garantizar la fiabilidad, la tolerancia a fallos y la consistencia de los datos. Al implementar patrones idempotentes robustos y aprovechar herramientas como DynamoDB, SQS y SNS, los desarrolladores pueden mitigar los riesgos que presentan los reintentos y los eventos duplicados. Esta guía demuestra cómo adoptar estas prácticas no solo mejora la fiabilidad del sistema, sino que también genera confianza con los usuarios al proporcionar experiencias fluidas y sin errores. A medida que crece la demanda de sistemas resilientes y escalables, dominar la idempotencia se convierte en un pilar del diseño moderno de software.
Source:
https://dzone.com/articles/idempotency-and-reliability-in-event-driven-systems