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.

Trabajos duplicados en la cola SQS FiFo de Laravel 8.0

Estoy usando un comando en Laravel 8.0 para despachar más de 1000 trabajos en una cola FiFo de Amazon SQS. Y los procesaré utilizando el comando php artisan queue:work, que funciona correctamente por sí solo. Pero cuando inicio múltiples sesiones de línea de comandos y comienzo los trabajadores de la cola, todos empiezan a recoger el mismo trabajo exacto cada vez.

También tuve este problema al usar Redis, pero esperaba solucionarlo utilizando SQS FiFo. ¿Estoy haciendo algo mal, o debería utilizar otro servicio para este tipo de propósito?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para trabajos duplicados en la cola FIFO de Amazon SQS

    Si estás experimentando el problema de que varios trabajadores toman el mismo trabajo repetidamente de una cola FIFO de Amazon SQS, podría ser debido a las siguientes razones:

    1. Suponiendo que tienes un comando llamado exampleCommand y se despacha desde tu aplicación Laravel a SQS usando el método dispatch() de Laravel. Es posible que el método dispatch() no esté estableciendo un MessageGroupId único para cada trabajo, lo cual es importante para que SQS mantenga el orden FIFO de los mensajes. Por lo tanto, puedes intentar establecer el MessageGroupId a un valor único para cada trabajo que se despacha a SQS. Por ejemplo:
    dispatch((new ExampleCommand())->onQueue('queue-name')->onConnection('aws')->withChain([])->onQueue('example-queue')->onConnection('sqs')->withDelay(now()->addSeconds(5))->messageGroup('unique-group-id'));
    

    En el comando anterior, ->messageGroup('unique-group-id') establece un MessageGroupId único para cada trabajo despachado.

    1. Suponiendo que has establecido un MessageGroupId único para cada trabajo, pero aún así enfrentas el problema. Esto puede ser debido a que algunos trabajos son eliminados de la cola antes de ser procesados. Entonces, cuando un trabajador intenta tomar un trabajo eliminado, automáticamente tomará el siguiente trabajo con el mismo MessageGroupId. Por ejemplo, si tienes 100 trabajos con MessageGroupId establecido en group-1, y si el trabajo número 50 es eliminado, entonces los trabajadores comenzarán a tomar el trabajo número 51 la próxima vez que busquen group-1, incluso si previamente habían tomado el trabajo número 50.

    Para resolver este problema, puedes intentar lo siguiente:

    • Utiliza una cola no-FIFO si no necesitas que los trabajos sean procesados en orden.
    • Aumenta el tiempo de visibilidad de los mensajes de SQS para asegurarte de que los mensajes eliminados permanezcan invisibles durante más tiempo. De esta manera, los trabajadores no tomarán el siguiente trabajo disponible con el mismo MessageGroupId inmediatamente después de tomar un trabajo eliminado.
    • Utiliza identificadores únicos para cada mensaje en la cola, en lugar de depender de que SQS los asigne automáticamente. De esta manera, puedes asegurarte de que no hay dos mensajes con el mismo ID, y los trabajadores no tomarán el mismo trabajo repetidamente.

    En general, se recomienda que utilices un MessageGroupId único y establezcas el tiempo de visibilidad en un valor razonable para evitar el procesamiento duplicado de trabajos.

Comments are closed.