Durante la mayoría de despliegues existe una ventana donde el código en disco ha cambiado pero los workers aún ejecutan la versión antigua. Los workers que reservan jobs en esta ventana deserializan cargas útiles del código antiguo y las ejecutan con el código nuevo, ocasionalmente causando fallos cuando las clases de job se renombran o las firmas de constructores cambian.
Laravel 13.25 aborda esto con un interruptor de pausa global que detiene a todos los workers en todas las conexiones de reservar nuevos jobs sin afectar el tráfico HTTP. Los tradicionales workarounds – modo mantenimiento (que detiene más que solo las colas) y queue:restart (una solicitud, no una garantía) – ahora se complementan con esta solución dedicada.
La sintaxis de comandos es sencilla: php artisan queue:pause --all y php artisan queue:resume --all. El argumento queue se vuelve opcional; sin --all, los comandos funcionan como antes con un par connection:queue. La misma funcionalidad está disponible a través de la facade Queue para scripts de despliegue basados en PHP o controladores de administración usando Queue::pauseAll() y Queue::resumeAll().
Pausar detiene a los workers de reservar nuevos jobs pero mantiene vivos los procesos workers y en bucle; simplemente duermen en lugar de procesar. Los jobs ya procesando cuando se invoca la pausa se ejecutan hasta completarse. Los productores no se ven afectados: SomeJob::dispatch() continúa escribiendo en Redis o la base de datos, y esos jobs permanecen en cola hasta la reanudación.
La implementación usa una única clave de caché, illuminate:queues:paused, establecida con forever(). Los workers ya verifican caché una vez por bucle para reinicio y señales de pausa por cola; la clave global se obtiene en la misma llamada many(), sin añadir round trips adicionales. QueueManager::isPaused() y getPausedQueues() reportan una cola como pausada cuando la clave global o su clave individual está establecida.
Los mecanismos de pausa global e individual son independientes. Si una cola fue pausada individualmente antes del despliegue, resumeAll() la deja pausada – una decisión de diseño deliberada. Alguien puede haber estacionado la cola intencionalmente para investigar un job defectuoso, y un despliegue automatizado no debe deshacer silenciosamente acciones manuales. Limpiar pausas individuales aún requiere queue:resume connection:queue.
Dos nuevos eventos acompañan los eventos existentes por cola QueuePaused y QueueResumed: QueuesPaused y QueuesResumed se disparan cuando ocurre pausa o reanudación global, permitiendo que las aplicaciones registren o monitoreen estas acciones de despliegue.
La característica fue contribuida por Jack Bayliss en la solicitud de cambio #61126.
Comentarios
Aún no hay comentarios — escribe el primero.
Inicia la conversación
Sin cuenta ni contraseña — introduce tu correo y te enviamos un enlace de acceso de un solo uso. ¿Primera vez? Todo se configura automáticamente.
Tu valoración se aplicará automáticamente al iniciar sesión.
Revisa tu bandeja de entrada
Hemos enviado un enlace de acceso a …. Ábrelo en este dispositivo — esta pestaña te conectará automáticamente.
¿No llega nada? Mira en la carpeta de spam — y marca el correo como «No es spam» para que la próxima vez llegue directo.