DEV Community

Gerenciamento de Cron Jobs em Golang

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.NewTicker para intervalos regulares.
  • Isolamento de Erros (Recover): Capturar e logar erros sem interromper o Manager.
  • Contexto de Cancelamento: Propagar o context.Context para 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)