Hvis en http.Client allerede deles av samtidige forespørsler, hold Transport-feltet stabilt. En innpakning kan synkronisere hvilken fullt konfigurert transport hver senere rundtur mottar:

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()
}

Med net/http og sync, initialiser den før klienten publiseres:

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

slot.Set(nextTransport)

initialTransport og nextTransport må være ikke-nil, fullt konfigurerte og samtidighetssikre rundtursutførere. Bygg hver proxytransport før den publiseres, og la konfigurasjonen være uendret mens forespørsler bruker den.

Låsen beskytter bare pekerens øyeblikksbilde, så en treg forespørsel holder ikke rutingslåsen under hele sin nettverksutveksling. En forespørsel som allerede bruker det forrige øyeblikksbildet, fortsetter på den transporten; byttet spiller den ikke av på nytt eller flytter tilkoblingen.

Behold og avvikle gamle transporter gjennom applikasjonens avgrensede livssyklus, la pågående arbeid fullføres og lukk inaktive bassenger når det passer. En omdirigering kan forårsake en ny RoundTrip etter et bytte. Hvis en hel arbeidsflyt krever én rute, tilordne den ved arbeidsflytens grense i stedet for å endre denne delte velgeren midtveis.

Relaterte artikler