Foto de Peter Gombos na Unsplash
Duplicidade em job é uma das coisas mais comuns (e mais perigosas) em produção. E não adianta lutar contra isso achando que “não vai acontecer”. Vai. Worker cai, timeout estoura, conexão oscila, retry acontece, o mesmo evento chega duas vezes, o deploy reinicia processo no meio… e pronto: job roda de novo.
O objetivo não é “garantir que nunca execute duas vezes”. O objetivo é garantir que executar duas vezes não cause dano.
Abaixo estão as estratégias que realmente funcionam em projetos Laravel médios e grandes.
Idempotência significa: rodar uma vez ou dez vezes dá o mesmo resultado final.
Isso é o que separa um job saudável de um job que vai te dar dor de cabeça.
Exemplos práticos:
Em termos práticos, idempotência quase sempre vira: checar estado antes de executar e persistir o estado depois.
Toda vez que o seu sistema gera um job, ele deveria ter um identificador estável do evento.
Exemplo:
event_id do webhook recebidomessage_id da sua tabelaorder_id + status (depende do caso)Aí você registra algo como:
O melhor lugar para isso quase sempre é o banco, porque é fonte de verdade.
Se duplicidade causa duplicação de registro, não confie só em lógica de aplicação. Use o banco como proteção.
Exemplos:
invoice(event_id)notifications(message_id, channel)syncs(external_id)A aplicação tenta criar; se já existe, você trata e segue.
Isso é robusto porque:
Locks são úteis quando você quer garantir que apenas um worker execute determinada seção crítica ao mesmo tempo.
Exemplo:
order_idEm Laravel, dá pra fazer lock via cache (Redis):
lock:order:123Importante: lock não substitui idempotência. Ele reduz concorrência, mas não garante que um retry nunca vai rodar depois.
Laravel tem suporte para jobs únicos (dependendo da versão/config), mas isso é mais útil para evitar enfileirar duplicado, não para evitar execução duplicada em qualquer cenário.
Use se:
Mesmo com unique job, eu continuo recomendando idempotência + banco.
Muita duplicidade aparece porque:
Ajuste bem:
timeout realista (nem baixo demais, nem infinito)tries coerente com o impactobackoff crescente para não sobrecarregar dependência externaO objetivo é evitar “tempestade de retries”.
Quando duplicidade é perigosa, normalmente é porque o job faz um efeito colateral irreversível (ex: cobrar cartão, enviar WhatsApp, emitir nota). A abordagem mais segura é:
Isso cria trilha de auditoria e evita “executar no escuro”.
Você só descobre duplicidade tarde se não tiver rastreabilidade.
Boas práticas:
job_id/correlation_id em logsQuando dá problema, você quer saber: “por que rodou duas vezes?” em 2 minutos, não em 2 horas.
Se eu tivesse que resumir num padrão prático:
processed_events) com uniqueIsso cobre 95% dos casos reais.
Em produção, duplicidade em job não é exceção. É comportamento esperado do mundo real (retries, falhas, concorrência). O caminho profissional é aceitar isso e desenhar o job para ser seguro.
Job bom é o que pode rodar duas vezes sem te acordar de madrugada.
Automatizar cobranças nunca foi simples. Entre regras bancárias, vencimentos, Pix, boletos registrados, notificações, inadimplência e…
WhatsApp é um canal excelente para alerta porque ele tem uma característica que e-mail e…
Em processos seletivos técnicos, não basta entregar código funcional. Cada vez mais, empresas avaliam arquitetura,…
O Notifish é um plugin para WordPress oficialmente aprovado no repositório do WordPress que permite…
A maioria dos desenvolvedores PHP sabe fazer CRUD.Isso não te torna pleno. Muito menos sênior.…
Você não precisa ser especialista nem passar horas auditando código para saber se um projeto…