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)