Dando continuidade à nossa série sobre tarefas em segundo plano, hoje vamos focar em algo que todo o sistema robusto precisa: Cron Jobs.
Muitas vezes, precisamos executar uma tarefa em intervalos específicos: a cada 30 minutos, 15 segundos, ou a cada 2 horas.
Recapitulando: Worker vs Cron Job
Embora ambos rodem em background:
- Worker: Foca no processamento contínuo (ex: consumir uma fila até que ela fique vazia).
- Cron Job: Foca na recorrência agendada (ex: gerar um relatório de 15 em 15 minutos).
Exemplos comuns de Cron Jobs
- Limpeza de arquivos temporários: Evitar que o disco fique cheio com logs antigos.
- Relatórios de Negócio: Consolidar vendas do dia anterior.
- Sincronização de Dados: Atualizar taxas de câmbio ou stocks de APIs externas.
- Backup de Segurança: Realizar dumps periódicos de tabelas críticas.
O problema da falta de orquestração
Quando começamos a criar vários jobs espalhados pelo código, o problema aparece rápido:
- Visibilidade: Quais tarefas estão ativas agora?
- Resiliência: Se uma tarefa entrar em "panic", ela vai derrubar toda a minha API?
- Encerramento Limpo: Se eu desligar o servidor, as tarefas param no meio do caminho corrompendo dados?
A solução é simples: um Cron Job Manager.
Passos para criação do Cron Job Manager
- Definir uma Interface: Padronizar as operações necessárias, com nome, um tempo de agendamento e o método de execução.
- Implementar o Engine com Tickers: Usar
time.NewTickerpara intervalos regulares. - Isolamento de Erros (Recover): Capturar e logar erros sem interromper o Manager.
- Contexto de Cancelamento: Propagar o
context.Contextpara que todas as Goroutines respeitem o sinal de paragem do sistema.
Vantagens desta Arquitetura
- Graceful Shutdown: recebe o sinal de cancelamento do Sistema Operativo e avisa os jobs para terminarem as suas operações de forma segura.
- Desacoplamento: O motor do Cron não conhece a regra de negócio; ele apenas executa "contratos".
- Observabilidade: Centralização de logs, permitindo rastrear o início e o fim de cada operação.
- Plug and Play: Adicionar um novo job é simples. Basta registarmos no Manager.
Código fonte: https://github.com/ortizdavid/golang-pocs/tree/main/cronjob-manager








Top comments (0)