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?
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:
exampleCommand
y se despacha desde tu aplicación Laravel a SQS usando el métododispatch()
de Laravel. Es posible que el métododispatch()
no esté estableciendo unMessageGroupId
único para cada trabajo, lo cual es importante para que SQS mantenga el orden FIFO de los mensajes. Por lo tanto, puedes intentar establecer elMessageGroupId
a un valor único para cada trabajo que se despacha a SQS. Por ejemplo:En el comando anterior,
->messageGroup('unique-group-id')
establece unMessageGroupId
único para cada trabajo despachado.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 mismoMessageGroupId
. Por ejemplo, si tienes 100 trabajos conMessageGroupId
establecido engroup-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 busquengroup-1
, incluso si previamente habían tomado el trabajo número 50.Para resolver este problema, puedes intentar lo siguiente:
MessageGroupId
inmediatamente después de tomar un trabajo eliminado.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.