Saltar a contenido

P3.1 Arquitectura de Colas y Procesamiento Asíncrono

Esquema de Arquitectura.
Esquema de Arquitectura.

Introducción al Problema

En las aplicaciones web tradicionales, cuando un usuario solicita una tarea pesada (como generar un reporte PDF, procesar un vídeo o enviar correos masivos), el navegador se queda "cargando" hasta que el servidor termina. Esto crea una mala experiencia de usuario y puede colapsar el servidor si muchas personas lo hacen a la vez.

Esta práctica implementa una solución profesional para este problema, separando la recepción de la orden de la ejecución de la tarea.

Desglose de Componentes

1. El Servidor Web (Web Server Block)

  • Actores: Usuario, Nginx, PHP-FPM.
  • Función: Actúa como la "recepción" de una empresa.
  • Comportamiento: Su única meta es responder rápido. Cuando el usuario pide una tarea pesada, el servidor web NO la hace. Simplemente toma nota del pedido, le dice al usuario "Oído, nos encargamos" y se libera inmediatamente para atender a otro cliente.

2. La Capa de Datos Intermedia (Data Layer)

  • Actores: Redis.
  • Función: Actúa como un "buzón" o "cola de espera".
  • Comportamiento: Almacena las tareas pendientes de forma temporal. Es extremadamente rápido (funciona en memoria RAM). Aquí se acumulan los pedidos que el servidor web ha recibido pero que aún no se han procesado.

3. El Servidor de Aplicaciones (Worker Server Block)

  • Actores: Supervisor, Laravel Worker (PHP CLI).
  • Función: Actúa como la "fábrica" o la "cocina".
  • Comportamiento:
    • Supervisor: Es el capataz. Su trabajo es vigilar que los trabajadores (workers) estén siempre activos. Si un trabajador se "cae" o falla, Supervisor lo levanta de nuevo automáticamente.
    • Worker: Es el operario incansable. Vive en segundo plano (background). Su ciclo de vida es: mirar si hay algo en Redis -> si hay, lo coge y lo procesa -> guarda el resultado -> vuelve a mirar Redis.

Flujo de Trabajo (Paso a Paso)

  1. Petición: El Usuario hace clic en "Procesar Datos".
  2. Recepción: Nginx recibe la petición y la pasa a Laravel (Web).
  3. Encargo (Dispatch): Laravel Web crea una "tarjeta de trabajo" (Job) con los datos necesarios y la deposita en Redis.
  4. Respuesta Inmediata: Laravel Web responde al Usuario: "Tu tarea está en proceso". El usuario sigue navegando feliz sin esperar.
  5. Procesamiento: En el servidor de fondo, el Worker (vigilado por Supervisor) detecta que ha llegado trabajo nuevo a Redis.
  6. Ejecución: El Worker toma la tarea y dedica el tiempo necesario (5 segundos, 1 minuto, etc.) a completarla.
  7. Finalización: Una vez terminada, el Worker registra el resultado (en este caso, escribe en el Log) y queda listo para la siguiente tarea.

Conclusión

Este diseño desacopla el "Front-end" (lo que ve el usuario) del "Back-end Heavy" (el procesamiento real), permitiendo que la aplicación sea: * Escalable: Puedes añadir más Workers si la cola crece mucho. * Robusta: Si el procesamiento falla, se puede reintentar sin que el usuario vea un error 500. * Rápida: El usuario nunca espera por tareas lentas.