- Registro de tareas: Se pueden crear tareas definiendo
arrival_timeyduration. - Algoritmo SJF: El consumidor utiliza Shortest Job First para decidir el orden de ejecución.
- Procesamiento distribuido: Se emplea RabbitMQ para la comunicación asíncrona entre el productor (API) y el consumidor.
- Persistencia: Las tareas se almacenan y gestionan en una base de datos PostgreSQL utilizando Prisma como ORM.
- Contenerización: Todos los servicios (API, consumidor, base de datos, RabbitMQ) se ejecutan en contenedores Docker orquestados con Docker Compose.
- Apagado controlado: El sistema cierra correctamente las conexiones y recursos al detenerse.
- Endpoint de salud: Se puede exponer un endpoint para verificar el estado del consumidor y la base de datos.
- Backend: Node.js, Express.js
- Base de datos: PostgreSQL
- ORM: Prisma
- Mensajería: RabbitMQ (amqplib)
- Contenerización: Docker, Docker Compose
- Lenguaje: TypeScript
- Clonar el repositorio
git clone https://github.com/albbeltran/tasks-scheduling.git
cd tasks-scheduling- Iniciar los contenedores
docker compose up- Iniciar Prisma
Una vez que los contenedores estén corriendo, iniciar Prisma en el contenedor del frontend:
docker compose exec frontend sh
npx prisma db pushEl sistema funciona de la siguiente manera:
- El usuario crea una tarea en el frontend, en la ruta '/', especificando
arrival_timeyduration. - La API recibe la tarea y la envía al consumidor a través de RabbitMQ.
- El usuario debera cuantas tareas desee para conocer el orden de ejecución mas eficiente.
- Una vez creadas las tareas, el usuario da clic en el boton 'Schedule Tasks' para obtener el orden de ejecución mas eficiente.
- La API envia una peticion al consumidor para obtener el orden de ejecución mas eficiente.
- El consumidor recibe la peticion y se conecta a RabbitMQ para obtener las tareas.
- El consumidor procesa las tareas en orden de llegada y las envia a la base de datos.
- El consumidor actualiza el estado de la tarea en la base de datos.
- El usuario puede ver el orden de ejecución mas eficiente en la ruta '/scheduling'.
NOTA: El orden de ejecucion mas eficiente podria no reflejarse instantaneamente en la ruta '/scheduling' ya que el consumidor puede estar ocupado procesando tareas. Si eso sucede, recargar la pagina '/scheduling'.
- Frontend: Permite crear tareas y mostrar el estado de las mismas.
- Backend: Recibe las tareas y las procesa en orden de llegada.
- RabbitMQ: Se encarga de la comunicación asíncrona entre el productor (API) y el consumidor.
- PostgreSQL: Almacena las tareas y su estado.
| Directorio/Archivo | Descripción |
|---|---|
| docker-compose.yml | Configuración de los servicios Docker |
| README.md | Documentación del proyecto |
| src/ | Código del backend (consumidor) |
| src/app.ts | Servidor Express principal |
| src/consumer.ts | Consumidor de RabbitMQ |
| src/scheduler.ts | Implementación del algoritmo SJF |
| src/generated/ | Código generado por Prisma |
| tasks-manager/ | Frontend (Next.js) |
| tasks-manager/src/app/page.tsx | Página principal del frontend |
| tasks-manager/src/components/TaskForm.tsx | Componente para crear tareas |
| tasks-manager/src/components/TaskList.tsx | Componente para mostrar lista de tareas |
| tasks-manager/src/components/SchedulingView.tsx | Componente para mostrar el orden de ejecución |
| tasks-manager/src/api/ | Endpoints API del frontend |
| tasks-manager/prisma/ | Esquema y migraciones de la base de datos del frontend |
| tasks-manager/Dockerfile | Dockerfile del frontend |
| tasks-manager/tsconfig.json | Configuración de TypeScript del frontend |
| prisma/ | Esquema y migraciones de la base de datos del backend |
| Dockerfile | Dockerfile del backend |
| package.json | Dependencias y scripts del proyecto |
| tsconfig.json | Configuración de TypeScript |
| .env | Variables de entorno |
| .gitignore | Archivos ignorados por git |