Middle+
Дар бораи охирин нокомӣ гап зан — чӣ шуд, чӣ гуна ёфтанд ва чӣ гуна ҳал карданд?
sobes.tech AI
Ҷавоб аз AI
Go-да соңғы жобаларымыздың бірінде, параллель сұраулардың көптігін өңдейтін қызметте жады ағуы мәселесіне тап болдық. Жүйе біртіндеп баяулап, ақырында жадының жетіспеушілігі қатесімен құлады.
Себебі — горутиндерді дұрыс пайдаланбау: әр сұрау үшін горутин іске қосамыз, бірақ олардың аяқталуын бақыламаймыз және контекстке байланысты ресурстарды босатпаймыз.
Мәселе pprof профайлерімен анықталды, ол горутиндердің санының және жады тұтынудың өсуін көрсетті.
Шешім:
- Горутиндер үшін уақытша шектеуі бар контекст қосылды.
- Сұрауларды өңдеу қайта жазылды, горутиндердің аяқталуын қамтамасыз ету үшін.
- Бір уақытта жұмыс істеп жатқан горутиндердің максималды санын шектеу үшін пул енгізілді.
Горутинді тоқтату үшін контекстті пайдалану мысалы:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// тазалау және аяқтау
return
// өңдеу
}
}(ctx)