Skip to content

Entregable christopher ocares#12

Open
chrisocares wants to merge 1 commit into
yaperos:mainfrom
chrisocares:challenge/christopherocares
Open

Entregable christopher ocares#12
chrisocares wants to merge 1 commit into
yaperos:mainfrom
chrisocares:challenge/christopherocares

Conversation

@chrisocares
Copy link
Copy Markdown

- El reto elegido

Transferir fondos entre wallets de forma atómica sin transacciones distribuidas. La implementación debe ser segura para replay desde cualquier paso, compensar en caso de fallo, y servir un read model CQRS que refleje el estado actual de cada transferencia.
Elegio este reto por que considero que demuestra un mecanismo de transacciones bancarias que en base a una arquitectura solidad se obtiene un alto nivel de seguridad en la operación que es muy importante para mantener a los clientes y no caer en errores básicos que afecten al negocio.

-Decisiones clave:

  • Orquestación sobre coreografía — estado de saga explícito y centralizado
  • State machine hand-rolled sobre Temporal — demuestra los fundamentos sin infraestructura extra
  • PostgreSQL con SELECT FOR UPDATE para concurrencia de wallets — balance negativo imposible
  • transfer.updated como evento de proyección — el query-service es un projector tonto sin lógica de negocio
  • string para cantidades monetarias en wire format — BigInt no es JSON-serializable

El razonamiento completo de cada decisión y sus alternativas rechazadas está en ADR.md.

- Con más tiempo

  1. Outbox pattern para eliminar la ventana entre persistencia y emit de Kafka
  2. Dead letter topics con alertas y UI de reprocesamiento
  3. Integration tests con testcontainers (Postgres + Kafka reales en Docker)
  4. Job de reconciliación para sagas en estado AMBIGUOUS
  5. DB por servicio — cada microservicio con su propia instancia PostgreSQL

- Limitaciones conocidas

  • Sin outbox transaccional: el estado del saga puede guardarse en DB sin que el mensaje Kafka correspondiente se envíe (ventana de fallo entre las dos operaciones). Documentado en ADR-008.
  • Una partición Kafka por tópico: sin escalado horizontal de consumers por diseño del challenge.
  • Instancia PostgreSQL compartida: en producción cada servicio tendría su propia DB. La separación lógica existe (conexiones TypeORM separadas, entidades distintas).
  • Estado AMBIGUOUS sin resolución automática: requiere un job de reconciliación externo.
  • Sin autenticación en los endpoints HTTP.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant