Sobes.tech
Middle+

Erzähl mir vom letzten Fail — was ist passiert, wie habt ihr es gefunden und wie habt ihr es gelöst?

sobes.tech KI

Antwort von AI

In einem unserer letzten Projekte in Go stießen wir auf ein Speicherleck-Problem in einem Dienst, der eine große Anzahl paralleler Anfragen verarbeitete. Das System begann allmählich langsamer zu werden und fiel schließlich mit einem Out-of-Memory-Fehler aus.

Die Ursache war eine falsche Verwendung von Goroutines: Wir starteten für jede Anfrage eine Goroutine, kontrollierten deren Beendigung jedoch nicht und gaben die mit dem Kontext verbundenen Ressourcen nicht frei.

Das Problem wurde mit dem Profiler pprof entdeckt, der einen Anstieg der Goroutinenanzahl und des Speicherverbrauchs zeigte.

Lösung:

  • Hinzufügen eines Kontexts mit Timeout und Abbruch für Goroutines.
  • Umschreiben der Anfragebehandlung, um das Beenden der Goroutines zu garantieren.
  • Implementierung eines Goroutine-Pools, um die maximale Anzahl gleichzeitig laufender Goroutines zu begrenzen.

Beispiel für die Verwendung eines Kontexts zum Abbrechen einer Goroutine:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // Bereinigung und Beendigung
        return
    // Verarbeitung
    }
}(ctx)