Փոխել Go HTTP փոխարինող ուղիները առանց Client.Transport-ի ձևափոխման
Օգտագործեք համաժամացված RoundTripper փաթաթան՝ նոր կարգավորված փոխանցիչ հրապարակելու համար՝ չփոփոխելով http.Client-ի գործող դաշտը։
Եթե 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։ Եթե ամբողջ աշխատահոսքը պահանջում է մեկ ուղի, նշանակեք այն աշխատահոսքի սահմանին՝ այս ընդհանուր ընտրիչը կես ճանապարհին փոխելու փոխարեն։