La guía para principiantes: Construir una pila de microservicios de Node.js con Docker, MongoDB y RabbitMQ

Guía para principiantes sobre cómo construir una pila de microservicios con Node.js, Docker, MongoDB y RabbitMQ. Aprende a integrar estas tecnologías para desarrollar aplicaciones escalables y eficientes.

domingo, 23 de noviembre de 2025 • 5 min de lectura • Equipo Q2BSTUDIO

Building a Node.js Microservices Stack with Docker, MongoDB, and RabbitMQ: Beginners Guide

Esta guía práctica muestra cómo montar un sistema pequeño de microservicios con Node.js, MongoDB para persistencia y RabbitMQ como broker de mensajes para notificaciones, incluyendo la explicación de la arquitectura, el flujo de datos, cómo ejecutarlo con Docker Compose y buenas prácticas para producción.

Resumen del proyecto: se construye un sistema simple compuesto por varios servicios independientes

user-service — API HTTP CRUD para usuarios que usa una base de datos MongoDB llamada users y escucha en el puerto 3000.

task-service — API HTTP CRUD para tareas que usa una base de datos MongoDB llamada tasks, y cuando crea una tarea publica un mensaje en la cola task_created de RabbitMQ. Escucha en el puerto 3001.

notification-service — consumidor que escucha la cola task_created y registra notificaciones simulando envíos de correo o push. No expone API, solo procesa mensajes; por coherencia puede ejecutarse en lo que documenta el puerto 3002 pero solo imprime en logs.

mongo — contenedor MongoDB con persistencia en un volumen Docker nombrado.

rabbitmq — RabbitMQ con la interfaz de administración incluida para visualizar colas y consumidores.

Todo se orquesta con un único archivo docker-compose.yml que declara los servicios, mapea puertos y define dependencias de arranque. Es importante recordar que depends_on controla orden de inicio de contenedores pero no garantiza que un servicio esté listo; las aplicaciones deben manejar reintentos o comprobar la disponibilidad.

Explicación resumida del docker-compose.yml: cada servicio se define como un bloque con su imagen o build, nombre de contenedor opcional, puertos expuestos y dependencias. El servicio mongo usa la imagen oficial de MongoDB y persiste datos en el volumen mongo_data montado en /data/db. RabbitMQ usa la imagen con plugin de management para acceder a la UI en el puerto 15672. Los microservicios se construyen desde carpetas locales con Dockerfile y exponen sus puertos para prueba local.

user-service: imagen Node base, copia de package.json, npm install durante la construcción, copia del código y comando para arrancar index.js. El servicio utiliza Express y Mongoose para conectarse a mongodb usando el host mongo que Docker Compose resuelve internamente. Rutas principales: GET para listar usuarios y POST para crear usuarios guardándolos en la colección users. Se recomienda aplicar reintentos o lógica de reconexión a MongoDB en entornos reales.

task-service: patrón similar al anterior pero además integra amqplib para conectar con RabbitMQ. Incluye una función de reconexión con varios intentos para mitigar condiciones de carrera durante el arranque. Cuando se crea una tarea el servicio la persiste en MongoDB y publica un mensaje JSON en la cola task_created. Si RabbitMQ no está conectado el servicio puede responder 503 hasta que se restablezca la conexión.

notification-service: consumidor que conecta a RabbitMQ, declara la cola task_created y registra cada mensaje recibido. En un sistema real aquí se implementaría el envío de correo, notificaciones push o llamadas a otros sistemas. Es importante usar acknowledgements para confirmar el procesamiento y considerar reintentos o colas de mensajes muertos para gestionar fallos.

Flujo de trabajo cuando se crea una tarea: el cliente hace POST a task-service con title, description y userId; task-service guarda la tarea en MongoDB; task-service publica un evento en RabbitMQ en task_created; notification-service consume el evento, ejecuta la lógica de notificación y ackea el mensaje para que RabbitMQ lo elimine de la cola. Este patrón desacopla productores y consumidores, mejora resiliencia y permite escalar consumidores independientemente.

Por qué usar RabbitMQ y cuándo aplicarlo: un message broker permite comunicación asíncrona entre servicios sin que ambos deban estar up al mismo tiempo. Beneficios clave: desacoplamiento, resiliencia ante caídas del consumidor, escalado horizontal de consumidores, buffering para picos de carga, posibilidad de retries y dead letter queues, y fácil incorporación de nuevos consumidores para audit logging o analítica sin tocar al productor. Use un broker cuando las operaciones derivadas no necesiten respuesta sincrónica, cuando desee desacoplar servicios o cuando espere ráfagas de eventos. Evite un broker para operaciones estrictamente sincrónicas que requieran transacciones distribuidas complejas o en prototipos muy simples donde la complejidad no compensa.

Cómo ejecutar localmente: desde la raíz del proyecto con docker-compose.yml ejecutar docker-compose up --build -d para construir y levantar en modo detached. Ver logs con docker-compose logs -f o docker logs -f nombre_contenedor. La UI de RabbitMQ está disponible en https://localhost:15672 con las credenciales por defecto guest guest en entornos locales; desde allí puede inspeccionar la cola task_created, bindings y consumidores.

Consejos de depuración: si task-service indica que RabbitMQ no está conectado comprobar logs de rabbitmq y la UI de administración; si Mongo falla revisar estado del contenedor mongo y entrar con docker exec para probar mongosh; si no llegan mensajes comprobar consumidores y colas en el panel de RabbitMQ; revisar restart policy y agregar lógica de reintento en los servicios para robustecer el arranque.

Buenas prácticas y consideraciones operativas: manejar reintentos y backoff en conexiones a dependencias, usar variables de entorno para URIs y credenciales, securizar RabbitMQ y MongoDB en producción, configurar monitoreo y alertas, y considerar estrategias de despliegue y escalado de consumidores según el volumen de mensajes.

Sobre Q2BSTUDIO: en Q2BSTUDIO somos una empresa de desarrollo de software especializada en aplicaciones a medida y software a medida, con experiencia en inteligencia artificial, ciberseguridad y servicios cloud. Ofrecemos soluciones integrales que incluyen servicios cloud aws y azure, servicios inteligencia de negocio y despliegue de agentes IA para automatizar procesos y potenciar la toma de decisiones con herramientas como power bi. Si busca construir una aplicación a medida o una arquitectura de microservicios puede conocer nuestros servicios de desarrollo en desarrollo de aplicaciones y software a medida y explorar nuestras soluciones de inteligencia artificial en servicios de inteligencia artificial para empresas.

Palabras clave integradas para posicionamiento: aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi.

Conclusión: este ejemplo es una base práctica y didáctica para entender persistencia con MongoDB, APIs con Express y mensajería con RabbitMQ. El código es intencionadamente sencillo para centrarse en patrones de arquitectura y mensajería; en producción se recomienda endurecer la seguridad, mejorar la gestión de errores y añadir observabilidad. Si necesita ayuda profesional para llevar este proyecto a producción o desarrollar soluciones a medida, Q2BSTUDIO puede acompañarle en todo el ciclo desde la concepción hasta el despliegue y mantenimiento.

¿UNA PAUSA?

Juega un momento antes de irte

NUESTROS SERVICIOS

Cómo podemos ayudarte

¿Tienes un proyecto en mente?

Cuéntanos tu visión y la convertimos en una solución de software. Sea cual sea el alcance, hacemos realidad tu idea.