Middle+
Mesélj a legutóbbi hibáról — mi történt, hogyan találták meg és hogyan oldották meg?
sobes.tech MI
Válasz az MI-től
A legutóbbi Go-projektjeink egyikében memória szivárgási problémával szembesültünk egy olyan szolgáltatásban, amely nagy számú párhuzamos kérést kezelt. A rendszer fokozatosan lassult, végül memóriahiányos hibával omlott össze.
Az ok a goroutine-ok helytelen használata volt: minden kéréshez egy goroutine-t indítottunk, de nem ellenőriztük azok befejezését, és nem szabadítottuk fel a kontextussal kapcsolatos erőforrásokat.
A problémát a pprof profilozó segítségével fedeztük fel, amely a goroutine-ok számának és a memóriahasználat növekedését mutatta.
Megoldás:
- Hozzáadtunk egy kontextust időkorláttal és leállítással a goroutine-okhoz.
- Átírtuk a kéréskezelést, hogy garantáljuk a goroutine-ok befejezését.
- Bevezettünk egy goroutine-poolt, hogy korlátozzuk az egyszerre futó goroutine-ok maximális számát.
Példa a kontextus használatára egy goroutine leállításához:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// takarítás és befejezés
return
// feldolgozás
}
}(ctx)