Unique Jobs
O sistema de Queue do MUCRM possui suporte nativo para Jobs únicos (Unique Jobs). Isso impede que o mesmo Job seja adicionado múltiplas vezes na fila simultaneamente.
Como Funciona
Quando um Job possui assinatura única (signature), o sistema impede duplicações automáticas no banco. Isso é extremamente útil para:
- Resets
- Premiações
- Eventos automáticos
- Tarefas críticas
- Schedulers
- Sincronizações
Problema Sem Unique
cron executa 2x
↓
2 jobs iguais entram na fila
↓
premiação duplicadaCom Unique
cron executa 2x
↓
primeiro job entra
↓
segundo job é ignoradoFuncionamento Interno
O MUCRM gera automaticamente uma assinatura baseada em:
classe do job + horário atualExemplo Real
<?php
namespace MUCRM\shared\jobs;
use MUCRM\engine\queue\job;
class weekly_ranking_reset extends job
{
public function schedule(): string
{
return '@weekly';
}
public function handle(): void
{
Ranking::truncate();
}
}Mesmo que o Scheduler rode múltiplas vezes: somente 1 reset será adicionado na fila.
Quando Utilizar
Ideal para:
- Reset semanal
- Reset diário
- Premiações automáticas
- Eventos globais
- Sincronizações
- Backups automáticos
- Limpeza automática
- Processamento crítico
Quando NÃO Utilizar
🚨Evite Unique Jobs para
Envio de emails, notificações, mensagens privadas, ações individuais, tarefas por usuário.
Exemplo Errado
SendRecoveryEmail::dispatch([
'email' => 'player@gmail.com'
]);Se emails fossem únicos: apenas 1 jogador receberia email.
ℹ️Correto
Emails devem permitir múltiplas execuções.
Scheduler e Unique
Todos os Jobs agendados (schedule()) já funcionam perfeitamente com proteção de duplicação.
class CastleSiegeReward extends Job
{
public function schedule(): string
{
return '0 21 * * 6';
}
public function handle(): void
{
Guild::rewardOwner();
}
}Resultado: premiação executada apenas 1 vez.
Benefícios
- Evita duplicações
- Evita premiações duplas
- Evita múltiplos resets
- Evita concorrência
- Aumenta segurança
- Reduz bugs críticos
Fluxo Interno
scheduler detecta job
↓
gera assinatura
↓
job já existe?
├── SIM → ignora
└── NÃO → adiciona na filaExemplo Completo
<?php
namespace MUCRM\shared\jobs;
use MUCRM\engine\queue\job;
use MUCRM\engine\support\log;
class WeeklyTopReset extends Job
{
public function schedule(): string
{
return '@weekly';
}
public function handle(): void
{
Ranking::truncate();
log::info(
'Ranking resetado com sucesso'
);
}
}Boas Práticas
- Utilize Unique Jobs apenas em tarefas globais
- Evite unique em ações por usuário
- Utilize logs para auditoria
- Utilize retries com cautela
- Monitore failed jobs
- Mantenha schedulers idempotentes
Resumo
Unique Jobs evitam execuções duplicadas de tarefas críticas dentro do sistema.