Եթե 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։ Եթե ամբողջ աշխատահոսքը պահանջում է մեկ ուղի, նշանակեք այն աշխատահոսքի սահմանին՝ այս ընդհանուր ընտրիչը կես ճանապարհին փոխելու փոխարեն։

Առնչվող հոդվածներ