03 · Avance Proyecto
Intentar dejar el inventory-service totalmente operativo, observable y emitiendo eventos de negocio.
Tareas
Crear el esquema Postgres
Copia el prisma/schema.prisma de abajo y ejecuta npx prisma migrate dev --name init_inventory
Codificar el núcleo de dominio
Crea ProductInventory.ts, Quantity.ts, InventoryRepositoryPort.ts
Escribir adaptadores
Repositorio Postgres + adaptador de eventos RabbitMQ – ver código; registra ambos en el contenedor Awilix
Exponer API HTTP
Handlers Fastify (
/inventory/:sku/reserve
yrelease
)
Conectar OpenTelemetry
Generar un
tracing.ts
en la raíz; impórtalo primero enmain.ts
; verifica la UI de Jaeger
Fin de las dos horas: el servicio puede reservar/liberar/reponer stock, registra trazas en Jaeger y publica un evento StockReserved que el order-service podrá consumir.
⸻
Caso de negocio – Inventory Service (bounded-context único)
1.1 Problema que resuelve
La empresa debe garantizar la reservación atómica de stock mientras permite miles de lecturas por segundo, dispara órdenes de compra cuando cae el stock de seguridad y proporciona una trazabilidad completa de movimientos.
1.2 Lenguaje ubicuo
Término Significado SKU: Código único de producto Stock Disponible: Unidades aún prometibles Reserva: Bloquea unidades para un pedido, reversible Movimiento: Evento inmutable de auditoría (reserve, release, replenish)
1.3 A completar
Value objects
Agreggates
Esquema de base de datos (Prisma)
Puertos y adaptadores
Eventos de dominio
Contrato HTTP (inventory-capi)
Secuencia – Reserva
Integración OpenTelemetry
Seteo de docker con PG, Prometheus, y Grafana y OTEL
Tests unitarios y de Integración, con TestContainers
Ejemplo de secuencia:
⸻
Qué harán los otros servicios
2.1 Contexto de sistema
Ambos servicios de dominio sólo hablan vía eventos; las APIs cliente permanecen como fachadas síncronas.
2.2 Saga cross-service (camino feliz)
orders-capi recibe POST /checkout
Llama a inventory-capi para reservar cada SKU
Cuando todas las reservas tienen éxito llama a order-service → OrderCreated
order-service publica OrderConfirmed tras el pago
inventory-service escucha; ante OrderCancelled libera stock.
Mañana codificarás dos orquestadores de saga: uno dentro de orders-capi (HTTP primero), otro dentro de order-service (event-driven fallback).
2.3 Topología RabbitMQ
Exchange Tipo Routing-keys ejemplo inventory.events topic StockReserved, StockReleased order.events topic OrderCreated, OrderCancelled
Cada servicio posee exactamente un exchange y nunca publica en exchanges ajenos – así la propiedad queda cristalina.
2.4 Números de flujo de datos
Paso SLA Propietario Reservar stock < 50 ms inventory-service Crear pedido < 80 ms order-service Propagación de eventos P99 < 30 ms clúster RabbitMQ
⸻
Checklist de calidad y buenas prácticas
• Aplica las reglas hexagonales: puertos delgados, adaptadores finos, DI con scopes (Prisma singleton, repos por scope)  • Testea el dominio en memoria (ejemplo ya escrito)  • Nunca loguees/traces desde entidades – instrumenta a nivel de adaptador (evita el anti-patrón “Domain HUD”)  • Utiliza el patrón Outbox cuando introduzcas la base de datos de pagos más adelante.
Última actualización