Laravel 13.31 añade trabajos interrumpibles, lo que permite que los workers de la cola capturen la señal SIGTERM enviada durante los despliegues y se cierren de forma limpia en lugar de abortar una tarea a mitad de camino. Los equipos que ejecutan trabajos largos —procesando decenas de miles de filas, enviando correos masivos o generando informes— se benefician porque los datos se mantienen consistentes cuando se lanza una nueva versión.

Por qué los despliegues han estado matando trabajos

Cuando llega una nueva versión, los gestores de procesos como Supervisor, Docker y Kubernetes indican a los workers existentes que se detengan enviando SIGTERM, una solicitud educada para terminar. La mayoría de los workers esperan a que el trabajo actual termine antes de salir. El problema surge cuando el gestor otorga solo unos pocos segundos para cumplir. Si un trabajo necesita minutos, el gestor escala a SIGKILL, matando el proceso instantáneamente. El trabajo nunca alcanza un estado consistente, dejando registros parcialmente actualizados, archivos huérfanos o trabajo duplicado.

La respuesta de Laravel: interrupción cooperativa

Laravel 13.31 introduce un contrato llamado Interruptible que una clase de trabajo puede implementar para estar al tanto de la solicitud de terminación. Cuando llega SIGTERM, Laravel llama al método interrupted() del trabajo. El framework no detiene el trabajo automáticamente; el trabajo debe verificar una bandera que Laravel establece y salir por su cuenta. Este modelo cooperativo permite a los desarrolladores terminar la iteración actual del bucle, revertir cambios parciales o escribir un punto de control antes de salir.

Cómo hacer que un trabajo sea interrumpible

  1. Implementar el contrato – añade implements Interruptible a la definición de la clase del trabajo.
  2. Verificar la bandera dentro del bucle de trabajo – inserta una comprobación en cada iteración para ver si el trabajo debe detenerse.
  3. Realizar la limpieza – en interrupted(), persiste cualquier estado que permita al trabajo reanudarse más tarde, o registra la interrupción para un análisis posterior.

La mayor trampa: no uses --once

Ejecutar el worker de la cola con php artisan queue:work --once desactiva por completo el manejo de señales. El worker procesa un único trabajo y sale, pero nunca registra el manejador de SIGTERM. En consecuencia, cualquier trabajo interrumpible ignora la solicitud de terminación y es matado a mitad del proceso. Este patrón aparece en contenedores impulsados por cron y en despliegues de un solo uso. Soluciónalo ejecutando el modo daemon (`

  1. Escanee los scripts de despliegue en busca de la bandera --once y reemplácela por el modo daemon donde se utilicen trabajos interrumpibles.
  2. Identifique los trabajos de mayor duración (aquellos que procesan decenas de miles de filas o se ejecutan durante varios minutos) y añada el contrato Interruptible.
  3. Inserte una verificación de bandera dentro de cada iteración del bucle y mueva cualquier código de finalización necesario al método interrupted().
  4. Conecte listeners a WorkerInterrupted y JobInterrupted para recopilar métricas sobre la frecuencia con la que los despliegues afectan al procesamiento.
  5. Para colas de Redis o de bases de datos, utilice totalSize() para monitorear el backlog; para SQS, mantenga las alarmas de CloudWatch activas.

Trate los cierres provocados por despliegues como un paso coordinado en lugar de una interrupción abrupta. Laravel 13.31 mantiene la consistencia de los datos y alivia los dolores de cabeza operativos de los trabajos a medio terminar. La contrapartida es un aumento modesto en la responsabilidad del código, pero los equipos que dependen de un procesamiento intensivo en segundo plano obtienen un entorno de producción más fiable.