Sobes.tech
Middle+

Parle-moi du dernier fiasco — que s'est-il passé, comment l'avez-vous trouvé et comment l'avez-vous résolu?

sobes.tech IA

Réponse de l'IA

Dans l'un de nos derniers projets en Go, nous avons rencontré un problème de fuite de mémoire dans un service traitant un grand nombre de requêtes parallèles. Le système a commencé à ralentir progressivement et a finalement échoué avec une erreur de mémoire insuffisante.

La cause était une mauvaise utilisation des goroutines : nous lancions une goroutine pour chaque requête, mais ne contrôlions pas leur terminaison ni ne libérions les ressources associées au contexte.

Le problème a été détecté à l'aide du profileur pprof, qui a montré une augmentation du nombre de goroutines et de la consommation de mémoire.

Solution :

  • Ajout d'un contexte avec timeout et annulation pour les goroutines.
  • Réécriture du traitement des requêtes pour garantir la terminaison des goroutines.
  • Mise en place d'un pool de goroutines pour limiter le nombre maximum de goroutines en cours.

Exemple d'utilisation du contexte pour annuler une goroutine :

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // nettoyage et fin
        return
    // traitement
    }
}(ctx)