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.
WhatsApp é um canal excelente para alerta porque ele tem uma característica que e-mail e…
Durante alguns anos, o AMP foi tratado como solução quase obrigatória para quem queria desempenho…
Performance, acessibilidade e boas práticas deixaram de ser “detalhes técnicos” e passaram a impactar diretamente…
O cenário (realista) Você quer receber um evento via API (Webhook), enviar uma mensagem no…
Automação deixou de ser algo exclusivo de grandes sistemas. Hoje, boa parte das aplicações depende…
Durante muito tempo, o WhatsApp foi visto apenas como um canal de comunicação direta: mensagens,…