hefestoapicontainer

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:

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.