Challenge 1 - Camilo Medina S.#5
Open
xavi13a wants to merge 1 commit into
Open
Conversation
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.
Elegí el Challenge 1: Payment settlement pipeline porque permite demostrar diseño distribuido con un enfoque basado en eventos y trabajar con foco en la confiabilidad operativa, aplicando conceptos como: transactional outbox, relay separado, consumidores idempotentes y DLT.
Decisiones arquitectónicas y alternativas rechazadas:
Decisiones tomadas
Transactional outbox en la API de pagos: payments + outbox_events se persisten en una sola transacción local.
Relay como proceso separado (outbox-relay): publica a Kafka fuera de la transacción SQL.
Idempotencia del lado consumidor por eventId usando processed_events con PK compuesta (consumerName, eventId).
DLT explícito: al agotar reintentos, se publica payment.failed.v1 y se marca el pago como failed.
Alternativas rechazadas
Publicar Kafka dentro de la transacción de DB.
Agregar complejidad no requerida para el challenge: Debezium, Temporal, Redis, múltiples bases, Confluent Cloud.
Resolver duplicación solo en broker/producer (se priorizó idempotencia en consumer, como pide el reto).
Repositorios independientes para cada componente
Outbox también para eventos downstream (payment.settled.v1 y payment.failed.v1) para continuar con la confiabilidad operativa.
Observabilidad más completa (métricas, tracing y dashboards).
Seguir el marco BIAN para nombrar los componentes
Se usa una sola base PostgreSQL para simplificar el challenge.
Publicación de payment.settled.v1 / payment.failed.v1 desde workers sin outbox, ni relay.
Topología local de Kafka de un solo broker (válida para desarrollo).
Namespace por país no implementado en core; quedó como mejora futura.