Este proyecto demuestra cómo implementar microservicios utilizando Kafka y NestJS. Incluye ejemplos de configuración, producción y consumo de mensajes, así como la integración con bases de datos y otros servicios.
- Objetivo del Proyecto
- Tecnologías Usadas
- Conocimientos Previos Recomendados
- Estructura del Proyecto
- Configuración de Kafka
- Instalación
- Ejecutar el Proyecto
- Ejecutar los Tests
- Licencia
El objetivo de este proyecto es proporcionar una guía práctica para implementar EDD con varios microservicios.
- En api se implementa un microservicio que produce mensajes a un topic de Kafka.
- En consumer se implementa un microservicio que consume mensajes de un topic de Kafka.
- NestJS como framework principal
- Kafka para mensajería
- Docker para contenerización
- Makefile para automatización de tareas
- Vitest para testing
Event-Driven Design (Diseño orientado a eventos) es un estilo arquitectónico en el que los componentes del sistema se comunican principalmente a través de eventos.
Un evento es algo que sucede en el sistema y que puede ser interesante para otros componentes. Por ejemplo:
- UsuarioRegistrado
- PedidoCreado
- ProductoAgotado
El flujo típico es:
- Un productor (emisor) genera un evento.
- Uno o más consumidores (receptores) escuchan ese evento y reaccionan en consecuencia.
La lógica del sistema se construye en torno a estos eventos.
- Sincrónica: menos común en EDD (tipo REST o RPC).
- Asíncrona: más común, usando colas o buses de eventos.
- Desacoplamiento entre componentes.
- Escalabilidad y extensibilidad.
- Mayor claridad en flujos de negocio complejos.
- Dificultad para depurar.
- Mayor complejidad en la gestión de estados/eventos.
- Requiere buenas prácticas para evitar el "infierno de eventos".
Apache Kafka es una plataforma de streaming distribuida diseñada para manejar flujos de datos en tiempo real. Es ideal para implementar arquitecturas event-driven.
- Producer: Publica eventos (mensajes).
- Topic: Canal donde se publican los eventos.
- Partition: Cada topic se divide en particiones para escalabilidad.
- Consumer: Lee eventos de un topic.
- Broker: Nodo del clúster de Kafka que almacena los eventos.
- Consumer Group: Un grupo de consumidores que procesan eventos de forma cooperativa.
Supongamos que tienes un sistema de pedidos:
- El microservicio Pedidos crea un pedido y publica un evento PedidoCreado en el topic pedidos.
- El microservicio Facturación escucha el topic pedidos, detecta PedidoCreado y genera una factura.
- El microservicio Inventario también escucha ese evento y actualiza el stock.
kafka-microservices/
├── api/
│ ├── config/ # Environment variables
│ ├── src/
│ ├── shared/
│ ├── users/
│ ├── test/
│ ├── application/ # Tests unitarios
├── event-consumer/
│ ├── config/ # Environment variables
│ ├── src/
│ ├── shared/
│ ├── users/
Para configurar Kafka, necesitas tener un clúster de Kafka en funcionamiento.
La primera vez que se lanza el proyecto, se debe generar la configuración de Kafka (carpeta kafka-data).
make format-kafkapnpm installPara el entorno local, se debe lanzar el siguiente comando:
make docker-upPara el entorno de producción, se debe lanzar el siguiente comando:
docker compose -f docker-compose-prod.yml up --build -dDentro del microservicio de api, puedes ejecutar los tests con el siguiente comando:
pnpm testEste proyecto está licenciado bajo la licencia MIT.
En la raíz del repositorio encontrarás un archivo llamado LICENSE que contiene el texto completo de la licencia. Este archivo indica los términos bajo los cuales puedes usar, modificar y distribuir este proyecto.
La licencia MIT es muy permisiva, permitiendo el uso libre del código siempre que se mantenga el aviso de copyright y la licencia original.
No se requiere configuración adicional para usar el proyecto bajo esta licencia, simplemente respeta las condiciones indicadas en el archivo LICENSE.