Middle+
გააზიარეთ ბოლო ფეილი — რა მოხდა, როგორ იპოვეთ და როგორ გადაწყვიტეთ?
sobes.tech AI
პასუხი AI-სგან
ჩვენი ბოლო პროექტების ერთ-ერთში, სადაც პარალელური მოთხოვნების დიდი რაოდენობა იყო, მეხსიერების ნაკადის პრობლემა გამოვლინდა სერვისში, რომელიც ამ მოთხოვნებს өңობდა. სისტემა ნელნელა აჩერებდა მუშაობას და საბოლოოდ მეხსიერების უკმარისობის შეცდომით ჩავარდა.
პრობლემა იყო goroutine-ების არასწორი გამოყენება: ჩვენ თითო მოთხოვნისთვის ვიწყებდით goroutine-ს, მაგრამ არ ვაკონტროლებდით მათი დასრულებას და რესურსებს, რომლებიც კონტექსტთან იყო დაკავშირებული, არ ვთავისუფლებდით.
პრობლემა გამოვლინდა pprof პროფაილერის დახმარებით, რომელმაც აჩვენა goroutine-ების რაოდენობის და მეხსიერების მოხმარების ზრდა.
შედეგი:
- დავამატეთ კონტექსტი დროის შეზღუდვით და გაუქმებით goroutine-ებისთვის.
- გადაწერეთ მოთხოვნების დამუშავება, რათა გარანტირებული იყოს goroutine-ების დასრულება.
- შევიყვანეთ goroutine-ის პული, რათა შეზღუდოთ ერთდროულად მუშაობა დაწყებული goroutine-ების მაქსიმალური რაოდენობა.
მაგალითი კონტექსტის გამოყენების goroutine-ის გაუქმებისთვის:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// სისუფთავე და დასრულება
return
// დამუშავება
}
}(ctx)