Jobs y Workers
Hefesto incluye workers (por defecto 2) que ejecutan tareas en segundo plano. Se usa la directiva ForTheWorker para encolar directivas.
Encolar una tarea con ForTheWorker
Imagina que tienes el siguiente endpoint para crear un usuario:
post /user:
LoadUser:
directive: LoadAndValidateModel
source: $.message.bodyAsArray
target: user
Connect:
directive: DatabaseConnect
SaveUser:
directive: SaveUser
user: $.memory.user
Si SaveUser es una tarea pesada (envío de emails, generación de PDFs, etc.), interponemos ForTheWorker:
post /user:
LoadUser:
directive: LoadAndValidateModel
source: $.message.bodyAsArray
target: user
ForTheWorker:
directive: ForTheWorker
identifier: true
delay: 60
Connect:
directive: DatabaseConnect
SaveUser:
directive: SaveUser
user: $.memory.user
ForTheWorker interrumpe el flujo del endpoint. Todas las directivas después de ForTheWorker (Connect, SaveUser) serán encoladas en Redis y procesadas por un worker.
Parámetros:
- identifier (opcional): si es
true, el endpoint devuelve inmediatamente un ID al cliente para consultar el estado del job. - delay (opcional, default 0): retrasa la ejecución del job N segundos.
Acceder al estado de un job
Dentro de una directiva que se ejecuta en worker, puedes usar WriteToJob para almacenar mensajes de progreso:
WriteToJob::run($state, [
'value' => ['mensaje' => 'Procesando...']
]);
Luego se consulta con un script al que le pasas el virtualhost público y el identifier que te devolvió ForTheWorker:
cd hefesto-server/scripts
./job-get.sh myhefesto.localhost 6a44d8125ad201.59755782
{
"mensaje": "Procesando"
}
Gestionar workers
Contar jobs:
cd hefesto-server/scripts
./job-count.sh myhefesto.localhost
{
"requests": 19, //todos los jobs recibidos
"waiting": 5, //los jobs que están esperando a ser procesados
"processing": 2, //los jobs procesándose en este momento
"failed": 2, //los jobs que fallaron
"success": 11 //los jobs que se ejecutaron con éxito
}
Reintentar jobs fallidos:
De esta forma todos los jobs en failed se moverán a waiting para volverse a procesar.
cd hefesto-server/scripts
./jobs-requeue-failed.sh myhefesto.localhost
{
"requeued": 2
}
Reiniciar los contadores:
Si quieres eliminar los jobs fallidos y reiniciar el resto de contadores.
cd hefesto-server/scripts
./jobs-flush.sh myhefesto.localhost
{
"count": 2 //el número de jobs fallidos eliminados
}
Aumentar el número de workers
Edita laradock/php-worker/supervisord.d/laravel-worker.conf, cambiando numprocs. Si ya has instalado, elimina el contenedor y su imagen, y vuelve a levantar con docker-compose up -d.