Sobes.tech
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)