es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Procesamiento de trabajos y eventos de Laravel en el mismo trabajador de la cola

Estoy tratando de ejecutar un proceso intensivo en tiempo en mi cola de trabajos. Tengo un evento que se dispara y envía un comando de socket a los usuarios conectados, y luego tengo un trabajo que se encola después y se ejecuta en segundo plano. Hasta ahora, nunca he ejecutado php artisan queue:work y mi sistema de eventos funcionaba perfectamente. Ahora estoy tratando de procesar mis trabajos y mis eventos Y trabajos están tratando de ser procesados por el mismo trabajador de cola.
entrar descripción de la imagen aquí

Aquí está el código que uso para dispararlos:
event(new ActivateItemAndUpdateRotation($id));
ChangeStatus::dispatch($id, $status);

Esto realmente afecta negativamente mi rendimiento porque los usuarios pueden cambiar los estados muy rápidamente, lo cual debe actualizarse rápidamente, y los trabajos pueden hacer su trabajo en segundo plano a medida que puedan. He intentado agregar los trabajos a una cola específica y solo ejecutar ese trabajador de cola, pero los eventos no se procesan en absoluto. Entonces realmente tengo dos preguntas:

1) ¿Cómo se han estado procesando los eventos sin ejecutar un trabajador hasta ahora?
2) ¿Es necesario tener dos trabajadores ejecutándose ahora para procesar los eventos y los trabajos de forma asíncrona?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Ejecución de un proceso intensivo en tiempo en la cola de trabajos

    Problema

    El usuario está experimentando problemas de rendimiento al ejecutar un proceso intensivo en tiempo en la cola de trabajos. Ha estado activando un evento que envía un comando de socket a los usuarios conectados y luego coloca un trabajo en la cola para su procesamiento. Sin embargo, los eventos y los trabajos se están procesando mediante el mismo trabajador de la cola, lo que está provocando una disminución en el rendimiento.

    Solución

    El usuario puede agregar los trabajos a una cola específica y ejecutar solo ese trabajador de la cola por separado de los eventos. Esto permitirá que los trabajos se procesen en segundo plano mientras los eventos se procesan de inmediato.

    Para agregar una cola específica al trabajo, el usuario puede agregar la propiedad $queue a la clase del trabajo de la siguiente manera:

    class CambiarEstado implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        public $id;
        public $estado;
        public $queue = 'estados';
    
        public function __construct($id, $estado)
        {
            $this->id = $id;
            $this->estado = $estado;
        }
    
        public function handle()
        {
            // procesar el trabajo aquí
        }
    }
    

    Luego, para ejecutar únicamente el trabajador de la cola de trabajos, el usuario puede utilizar este comando:

    php artisan queue:work --queue=estados
    

    En cuanto a las preguntas del usuario:

    1) No está claro cómo se han estado procesando los eventos sin ejecutar un trabajador hasta ahora. Es posible que los trabajos en cola se estuvieran procesando de otra manera, como mediante otro trabajador de cola o un trabajo programado.

    2) Sí, ahora es necesario tener dos trabajadores ejecutándose para procesar los eventos y los trabajos de forma asíncrona, ya que tienen diferentes requisitos de procesamiento.

Comments are closed.