Егер http.Client қазірдің өзінде қатар жүрген сұраныстармен бөлісіп жатса, оның Transport өрісін тұрақты ұстаңыз. Қабықша әр келесі айналым қай толық конфигурацияланған тасымалдағышты алатынын синхрондай алады:

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 және sync пайдаланып, клиентті жарияламас бұрын оны инициализациялаңыз:

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

slot.Set(nextTransport)

initialTransport және nextTransport nil емес, толық конфигурацияланған және қатарлыққа қауіпсіз болуы керек. Әрбір прокси тасымалдағышты жарияламас бұрын құрыңыз және сұраныстар оны пайдаланған кезде конфигурациясын өзгеріссіз қалдырыңыз.

Құлып тек көрсеткіш суретін қорғайды, сондықтан баяу сұраныс бүкіл желілік алмасу барысында маршруттау құлыпын ұстамайды. Алдыңғы суретті пайдаланып жатқан сұраныс сол тасымалдағышта жалғасады; ауыстыру оны қайта орындамайды және қосылымын жылжытпайды.

Ескі тасымалдағыштарды қосымшаның шектеулі өмірлік циклі ішінде сақтап, зейнеткерлікке шығарыңыз, орындалып жатқан жұмыстың аяқталуына мүмкіндік беріңіз және қажет болғанда бос пулдарды жабыңыз. Қайта бағыттау ауыстырудан кейін тағы бір RoundTrip тудыруы мүмкін. Егер бүкіл жұмыс ағыны бір маршрутты қажет етсе, осы ортақ селекторды жарты жолда өзгертудің орнына маршрутты жұмыс ағынының шекарасында тағайындаңыз.

Қатысты мақалалар