No meu projeto Laravel, tenho de 5 a 6 filas diferentes. Cada fila aciona a próxima em uma ordem estrita, formando uma cadeia de processamento como:
Tarefa1 → Tarefa2 → Tarefa3 → Tarefa4 → Tarefa5
O fluxo é sempre acionado por uma solicitação externa que começa com Job1. Cada job executa uma operação de arquivo (criação/modificação de arquivos), e esses arquivos são armazenados localmente no servidor onde o job é executado.
O problema surge quando tento escalar horizontalmente adicionando mais servidores para lidar com as filas. Como as filas do Laravel são distribuídas, não há garantia de que o Job2 será processado pelo mesmo servidor que lidou com o Job1 — o que interrompe o fluxo, pois o Job2 precisa acessar o arquivo local criado pelo Job1.
O que eu preciso : quero garantir que, quando o Job1 começar em um servidor específico, toda a cadeia de jobs (Job2 a Job5) continue no mesmo servidor — mesmo em uma configuração de vários servidores.
O que tentei : anexar uma "ID de máquina" à carga útil do trabalho — mas isso não ajuda a garantir que o trabalho será executado pela mesma máquina.
Pesquisei on-line por "trabalhos fixos" ou "fixar trabalhos no mesmo trabalhador/servidor" — mas não consegui encontrar uma solução limpa ou oficial.
Minha pergunta : Alguém já lidou com um requisito semelhante antes? Existe uma maneira comprovada de fixar cadeias de tarefas no mesmo servidor no Laravel ao executar um sistema de filas distribuídas?
Aqui está minha prova de conceito para lidar com isso.
Digamos que você tenha 3 servidores. Podem ser máquinas físicas ou máquinas virtuais/contêineres. Cada um deles terá sua própria fila.
Em sua aplicação Laravel, você pode fazer algo assim:
Se o
$random_queue
valor de forqueue1
, o trabalhador do Contêiner A será executado.Veja como o log ficará.
Isso mostra que cada um dos contêineres está executando suas próprias filas na ordem correta.
O problema com essa configuração é, obviamente, especificar a
--queue
opção noqueue:work
comando. Eu ainda recomendaria usar um servidor de arquivos compartilhado (como S3 ou Minio) para gerenciar seus servidores facilmente.