DEV Community

Gerenciamento de Workers numa aplicação Golang

Atualmente é indispensável que um sistema que cresce esteja preparado para processar tarefas em background.
Essas tarefas não devem interromper o fluxo normal da aplicação.
O melhor é estruturar como esses workers vão se comportar e permitir a configuração dos mesmos.

Felizmente, Golang nos dá a vantagem de criar estruturas que facilitam esse tipo de aplicações.
Usando Goroutines, channels e contextos de cancelamento, conseguimos criar essa estrutura.

Cron jobs VS Workers

Facilmente confundimos Cron Jobs com Workers. Eles partem do mesmo princípio de executar tarefas em segundo plano.

  • Worker: processa tarefas num ciclo infinito, usando a frequência e número de tentativas.
  • Cron Job: trabalha com agendamento, a tarefa é somente executada no tempo definido.

Exemplos mais comuns de Workers

  • Processamento de uma regra de negócio
  • Envio de dados para uma fila
  • Consumo e processamento de filas
  • Envio de e-mails recorrentes
  • Campanha de mensagens em massa
  • Envios de SMS

O problema de muitos workers

Quando a aplicação cresce, podemos ter várias tarefas por processar na aplicação.
Encadear cada tarefa torna o código difícil de ler e manter. Nesse caso, devemos achar uma estratégia para organizar e manter esse número de workers.
A forma mais elegante é o worker manager, organizador e orquestrador de workers, responsável pelo registro, chamada e ciclo de vida dos mesmos.

Passos para criação do Worker Manager

  • Definir uma interface para a base dos workers: Start, Stop e Worker Name
  • Criar o manager que agrupa os workers
  • Criar um mecanismo para iniciar e parar todos os workers
  • Se necessário, uma função para mostrar as infos dos workers registrados no sistema
  • Configurar o máximo de tentativas e o intervalo de tempo que os workers vão executar a operação

Vantagens

  • Graceful shutdown: o manager avisa a todos os workers quando parar. Eles não perdem dados, escutam o sinal de cancel e vão parando.
  • Estratégias de backoff
  • Modularidade
  • Código fácil de manter e evoluir
  • Arquitetura plug and play

No futuro veremos como implementar um cron job manager.

Código fonte: https://github.com/ortizdavid/golang-pocs/tree/main/worker-manager

Top comments (0)