Sobes.tech
Middle+

Fala sobre o último erro — o que aconteceu, como encontraram e como resolveram?

sobes.tech IA

Resposta da IA

Num um dos últimos projetos em Go, enfrentámos um problema de fuga de memória num serviço que processava um grande número de pedidos paralelos. O sistema começou a ficar mais lento gradualmente e acabou por falhar com um erro de falta de memória.

A causa foi um uso incorreto das goroutines: lançávamos uma goroutine por cada pedido, mas não controlávamos a sua finalização nem libertávamos os recursos associados ao contexto.

O problema foi detectado com o perfilador pprof, que mostrou um aumento no número de goroutines e no consumo de memória.

Solução:

  • Adicionámos um contexto com timeout e cancelamento para as goroutines.
  • Reescrevemos o processamento de pedidos para garantir a finalização das goroutines.
  • Implementámos um pool de goroutines para limitar o número máximo de goroutines em execução.

Exemplo de uso de contexto para cancelar uma goroutine:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // limpeza e finalização
        return
    // processamento
    }
}(ctx)