feat: implementación completa del pipeline de liquidación de pagos#6
Open
LuisEnrique23 wants to merge 1 commit into
Open
feat: implementación completa del pipeline de liquidación de pagos#6LuisEnrique23 wants to merge 1 commit into
LuisEnrique23 wants to merge 1 commit into
Conversation
…hallenge 1) - Arquitectura event-driven con Kafka y patrón Transactional Outbox - Consumidores idempotentes (Fraud, Ledger, Notify) con deduplicación por eventId - Relay independiente que publica eventos pendientes desde PostgreSQL a Kafka - Reintentos configurables (3 intentos) con Dead Letter Topic (DLT) - Status Saga que orquesta la transición final (pending a settled/failed) - Endpoint GET con metadatos de consistencia eventual - Docker Compose con PostgreSQL 16, Kafka y Zookeeper
daf1dd9 to
d4e1ab8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
¿Por qué elegí este challenge?
Elegí el Challenge 1 porque expone los problemas fundamentales de sistemas distribuidos en fintech: consistencia eventual, entrega confiable de mensajes y tolerancia a fallos parciales.
Decisiones arquitectónicas
Se implementa el patrón Transactional Outbox junto con un relay independiente para garantizar entrega at-least-once, evitando inconsistencias entre la base de datos y el broker de mensajería. El relay se ejecuta como un proceso separado, lo que permite su escalamiento y monitoreo sin depender del ciclo de vida de la aplicación principal.
La idempotencia se resuelve en los consumidores mediante el uso de un identificador único de evento (eventId), apoyado por una tabla processed_events con una restricción de unicidad sobre (eventId, consumerName), lo que evita el reprocesamiento ante entregas duplicadas.
Se utiliza PostgreSQL como base de datos por su soporte robusto de transacciones ACID, la capacidad de manejar estructuras flexibles con JSONB y funcionalidades como SELECT ... FOR UPDATE SKIP LOCKED, fundamentales para el procesamiento concurrente del outbox.
La transición de estados del pago se gestiona mediante una saga basada en eventos. El componente de orquestación consume el evento payment.created.v1, espera la recepción de confirmaciones de los servicios de fraude y contabilidad, y luego actualiza el estado del pago de forma reactiva, evitando mecanismos de polling.
Se implementa un Dead Letter Topic (DLT) para manejar mensajes que no pueden procesarse tras múltiples intentos. Estos mensajes se envían a payment.created.v1.dlt junto con información de error, lo que permite su análisis y eventual reprocesamiento.
Para el control de concurrencia en el relay, se utiliza FOR UPDATE SKIP LOCKED, lo que permite ejecutar múltiples instancias en paralelo sin riesgo de procesar el mismo registro más de una vez.
¿Qué haría diferente con más tiempo?
Limitaciones y atajos conocidos