
Arquitectura DDD en Microservicios: Caso práctico de un code Challenge
🚀 Challenge en TypeScript
Este fue un challenge técnico realizado recientemente, en el cual abordamos la resolución de los requisitos utilizando JavaScript/TypeScript, Domain-Driven Design (DDD), Kafka y Redis.
El objetivo fue construir una solución escalable y mantenible, aplicando buenas prácticas de arquitectura moderna y comunicación asincrónica basada en eventos.
📁 Podés encontrar el código fuente en el siguiente repositorio:
👉 https://github.com/maxirossi/challenge
MS-Taxi24
Microservicio para gestión de taxis en tiempo real.
🚀 Stack Tecnológico
- Node.js + TypeScript
- Express
- PostgreSQL
- Redis
- Kafka
- Docker + Docker Compose
📋 Prerrequisitos
- Docker y Docker Compose
- Node.js 18+
- npm 9+
🚀 Pasos para Levantar el Proyecto
1. Clonar el Repositorio
git clone <repository-url>
cd challenge
2. Configurar Variables de Entorno
# Copiar el archivo de ejemplo
cp .env.example .env
# Editar las variables según sea necesario
nano .env
El archivo .env
debe contener las siguientes variables:
# Database Configuration
DATABASE_URL="postgresql://postgres:postgres@postgres:5432/taxi24?schema=public"
# Server Configuration
PORT=3000
NODE_ENV=development
# JWT Configuration
JWT_SECRET=your-secret-key-here
JWT_EXPIRES_IN=24h
# Kafka Configuration
KAFKA_BROKERS=kafka:29092
KAFKA_CLIENT_ID=taxi24-service
KAFKA_GROUP_ID=taxi24-group
# Redis Configuration
REDIS_HOST=redis
REDIS_PORT=6379
3. Dar Permisos de Ejecución
sudo chmod +x init.sh
4. Construir el Proyecto
docker-compose up
Este comando:
- Construye las imágenes de Docker
- Instala las dependencias
- Prepara el entorno
5. Inicializar el Proyecto
./init.sh
Este comando:
- Ejecuta las migraciones de la base de datos
- Crea la cola de Kafka
- Inicia todos los servicios
6. Verificar que Todo Funcione
- Verificar que los contenedores estén corriendo:
docker compose ps
- Verificar los logs del servicio principal:
docker compose logs -f ms-taxi24
- Acceder a la API:
- URL:
http://localhost:3000
- Swagger UI:
http://localhost:3000/api-docs
🐳 Gestión de Docker y Base de Datos
Contenedores Docker
El proyecto utiliza los siguientes contenedores:
ms-taxi24
: El microservicio principalpostgres
: Base de datos PostgreSQLredis
: Sistema de geolocalización en tiempo realkafka
: Sistema de mensajeríakafka-ui
: Interfaz web para Kafka
Comandos Docker Útiles
# Ver todos los contenedores en ejecución
docker compose ps
# Ver logs de todos los servicios
docker compose logs -f
# Reiniciar un servicio específico
docker compose restart ms-taxi24
# Detener todos los servicios
docker compose down
# Eliminar todos los contenedores y volúmenes
docker compose down -v
Base de Datos PostgreSQL
Acceso a la Base de Datos
# Conectarse a la base de datos usando psql
docker compose exec postgres psql -U postgres -d taxi24
# Listar todas las tablas
\dt
# Ver estructura de una tabla
\d nombre_tabla
Gestión de Migraciones
# Ejecutar migraciones pendientes
docker compose exec ms-taxi24 npm run prisma:migrate
# Revertir última migración
docker compose exec ms-taxi24 npm run prisma:migrate:reset
# Ver estado de las migraciones
docker compose exec ms-taxi24 npm run prisma:migrate:status
Prisma Studio
Para gestionar la base de datos visualmente:
# Iniciar Prisma Studio
docker compose exec ms-taxi24 npm run prisma:studio
Acceder a: http://localhost:5555
Respaldo y Restauración
Respaldo de la Base de Datos
# Crear backup
docker compose exec postgres pg_dump -U postgres taxi24 > backup.sql
# Restaurar desde backup
cat backup.sql | docker compose exec -T postgres psql -U postgres -d taxi24
Solución de Problemas Comunes
Si la base de datos no inicia
# Verificar logs de PostgreSQL
docker compose logs postgres
# Reiniciar el contenedor de la base de datos
docker compose restart postgres
Si las migraciones fallan
# Resetear la base de datos
docker compose exec ms-taxi24 npm run prisma:migrate:reset
# Regenerar el cliente Prisma
docker compose exec ms-taxi24 npm run prisma:generate
Redis y Geolocalización
Propósito
Redis se utiliza para almacenar y gestionar la ubicación en tiempo real de los conductores, permitiendo:
- Tracking en tiempo real de vehículos
- Búsqueda de conductores cercanos
- Cálculo de distancias
- Gestión de zonas de servicio
Comandos Redis Útiles
# Conectarse a Redis CLI
docker compose exec redis redis-cli
# Ver todas las claves de geolocalización
KEYS *location*
# Ver información de un conductor específico
GET driver:location:{driverId}
# Ver conductores en un radio específico
GEORADIUS drivers:locations {longitude} {latitude} {radius} km
Estructura de Datos en Redis
# Ubicación de conductores
driver:location:{driverId} -> {latitude,longitude,timestamp}
# Zonas activas
zone:active:{zoneId} -> {center,radius,drivers}
# Historial de ubicaciones
driver:history:{driverId} -> [{lat,lon,timestamp},...]
Monitoreo de Geolocalización
# Ver logs de Redis
docker compose logs -f redis
# Monitorear comandos en tiempo real
docker compose exec redis redis-cli MONITOR
# Ver estadísticas de Redis
docker compose exec redis redis-cli INFO
Solución de Problemas de Geolocalización
# Limpiar datos de geolocalización
docker compose exec redis redis-cli FLUSHDB
# Verificar conexión de Redis
docker compose exec redis redis-cli PING
# Reiniciar Redis si hay problemas
docker compose restart redis
🔍 Acceso a los Servicios
API REST (ms-taxi24)
- URL:
http://localhost:3000
- Endpoints disponibles:
GET /v1/users
- Listar usuariosPOST /v1/users
- Crear usuarioGET /v1/passengers
- Listar pasajerosGET /v1/drivers
- Listar conductoresGET /v1/trips
- Listar viajesGET /v1/cars
- Listar autos
Kafka UI
- URL:
http://localhost:8080
- Funcionalidades:
- Ver tópicos de Kafka
- Monitorear mensajes
- Crear nuevos tópicos
- Ver consumidores y productores
PostgreSQL
- Host:
localhost
- Puerto:
5432
- Usuario:
postgres
- Contraseña:
postgres
- Base de datos:
taxi24
Redis
- Host:
localhost
- Puerto:
6379
- Sin autenticación por defecto
🛠️ Comandos Útiles
Docker Compose
# Ver logs de todos los servicios
docker compose logs -f
# Ver logs de un servicio específico
docker compose logs -f ms-taxi24
# Detener todos los servicios
docker compose down
# Reiniciar un servicio específico
docker compose restart ms-taxi24
# Ver estado de los contenedores
docker compose ps
Prisma
# Generar cliente Prisma
docker compose exec ms-taxi24 npm run prisma:generate
# Ejecutar migraciones
docker compose exec ms-taxi24 npm run prisma:migrate
# Abrir Prisma Studio
docker compose exec ms-taxi24 npm run prisma:studio
📝 Ejemplos de Uso
1. Crear un Usuario
curl -X POST http://localhost:3000/v1/users \
-H "Content-Type: application/json" \
-d '{
"name": "John",
"lastName": "Doe",
"email": "john@example.com",
"userName": "johndoe",
"password": "password123"
}'
2. Crear un Pasajero
curl -X POST http://localhost:3000/v1/passengers \
-H "Content-Type: application/json" \
-d '{
"userId": "user-id-from-previous-step"
}'
3. Listar Conductores Activos
curl -X GET http://localhost:3000/v1/drivers/active
🔍 Debugging
Logs por Servicio
# Microservicio
docker compose logs -f ms-taxi24
# Kafka
docker compose logs -f kafka
# Base de datos
docker compose logs -f postgres
Monitoreo de Eventos
- Abrir Kafka UI (
http://localhost:8080
) - Ir a la sección “Topics”
- Buscar el tópico
ms-taxi24-events
- Ver eventos de creación de usuarios y pasajeros
📚 Documentación Adicional
🤝 Contribución
- Fork el proyecto
- Crea tu rama de feature (
git checkout -b feature/AmazingFeature
) - Commit tus cambios (
git commit -m 'Add some AmazingFeature'
) - Push a la rama (
git push origin feature/AmazingFeature
) - Abre un Pull Request
📄 Licencia
Este proyecto está bajo la Licencia MIT - ver el archivo LICENSE.md para más detalles.
Características
- Gestión de usuarios (conductores y pasajeros)
- Gestión de vehículos
- Geolocalización en tiempo real de vehículos
- Gestión de viajes
- Eventos asíncronos con Kafka
- Documentación con Swagger
Estructura del Proyecto
src/
├── Modules/
│ ├── Cars/ # Gestión de vehículos
│ ├── CarLocation/ # Geolocalización en tiempo real
│ ├── Drivers/ # Gestión de conductores
│ ├── Passengers/ # Gestión de pasajeros
│ ├── Trips/ # Gestión de viajes
│ ├── Users/ # Gestión de usuarios
│ └── Shared/ # Componentes compartidos
├── Routes/ # Definición de rutas
└── server.ts # Punto de entrada
API Endpoints
La documentación completa de la API está disponible en Swagger UI:
http://localhost:3000/api-docs
Principales Endpoints
- Users:
/v1/users
- Drivers:
/v1/drivers
- Passengers:
/v1/passengers
- Cars:
/v1/cars
- Trips:
/v1/trips
Desarrollo
Scripts Disponibles
npm run dev
: Inicia el servidor en modo desarrollonpm run build
: Compila el proyectonpm start
: Inicia el servidor en modo producciónnpm test
: Ejecuta los testsnpm run lint
: Ejecuta el linternpm run format
: Formatea el código
Tests
# Ejecutar todos los tests
npm test
# Ejecutar tests en modo watch
npm run test:watch
# Ejecutar tests con cobertura
npm run test:coverage