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