Sobes.tech
Middle+

So'nggi xatolik haqida gapir — nima bo'ldi, qanday topildi va qanday hal qilindi?

sobes.tech AI

AIdan javob

Go dasturimizdagi so'nggi loyihalarimizdan birida, ko'p miqdordagi parallel so'rovlarni ishlovchi xizmatda xotira oqishi muammosiga duch keldik. Tizim asta-sekin sekinlashdi va oxir-oqibat xotira to'lib, xatolik bilan yiqildi.

Muammo goroutine'larning noto'g'ri ishlatilishi edi: har bir so'rov uchun goroutine ishga tushirardik, lekin ularning yakunlanishini nazorat qilmasdik va kontekst bilan bog'liq resurslarni bo'shatmasdik.

Muammo pprof profiler yordamida aniqlangan, u goroutinelar sonining va xotira iste'molining o'sishini ko'rsatdi.

Yechim:

  • Goroutine'lar uchun timeout va bekor qilish bilan kontekst qo'shdik.
  • So'rovlarni qayta yozdik, goroutine'larning yakunlanishini ta'minlash uchun.
  • Bir vaqtning o'zida ishlayotgan goroutine'lar sonini cheklash uchun goroutine havuzini joriy etdik.

Goroutine'ni bekor qilish uchun kontekstdan foydalanish misoli:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // tozalash va yakunlash
        return
    // ishlov berish
    }
}(ctx)