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)