Agar http.Client allaqachon parallel so‘rovlar tomonidan baham ko‘rilayotgan bo‘lsa, uning Transport maydonini barqaror saqlang. O‘ram har bir keyingi aylanish qaysi to‘liq sozlangan transportni olishini sinxronlashi mumkin:

type routeSlot struct {
    mu sync.RWMutex
    current http.RoundTripper
}

func (s *routeSlot) RoundTrip(r *http.Request) (*http.Response, error) {
    s.mu.RLock()
    current := s.current
    s.mu.RUnlock()
    return current.RoundTrip(r)
}

func (s *routeSlot) Set(next http.RoundTripper) {
    s.mu.Lock()
    s.current = next
    s.mu.Unlock()
}

net/http va sync yordamida mijozi e’lon qilishdan oldin uni ishga tushiring:

slot := &routeSlot{current: initialTransport}
client := &http.Client{Transport: slot}

slot.Set(nextTransport)

initialTransport va nextTransport nil bo‘lmasligi, to‘liq sozlangan va parallellikka xavfsiz bo‘lishi kerak. Har bir proksi transportini e’lon qilishdan oldin quring va so‘rovlar undan foydalanayotganda konfiguratsiyasini o‘zgartirmang.

Qulf faqat ko‘rsatkich suratini himoya qiladi, shuning uchun sekin so‘rov butun tarmoq almashinuvi davomida marshrutlash qulfini ushlab turmaydi. Oldingi suratdan foydalanayotgan so‘rov o‘sha transportda davom etadi; almashtirish uni qayta ishga tushirmaydi va ulanishini ko‘chirmaydi.

Eski transportlarni ilovaning cheklangan hayot sikli davomida saqlang va iste’foga chiqaring, davom etayotgan ish tugashiga imkon bering va kerak bo‘lganda bo‘sh hovuzlarni yoping. Qayta yo‘naltirish almashtirishdan keyin yana bir RoundTrip keltirib chiqarishi mumkin. Agar butun ish oqimi bitta marshrutni talab qilsa, bu umumiy selektorni yarim yo‘lda o‘zgartirish o‘rniga marshrutni ish oqimining chegarasida belgilang.

O'xshash maqolalar