Če si http.Client že delijo sočasne zahteve, ohranite njegovo polje Transport stabilno. Ovoj lahko sinhronizira, kateri popolnoma konfiguriran prenosnik prejme vsak naslednji krog:

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

Z net/http in sync ga inicializirajte pred objavo odjemalca:

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

slot.Set(nextTransport)

initialTransport in nextTransport morata biti ne-nil, popolnoma konfigurirana in varna glede sočasnosti. Vsak proxy prenosnik zgradite pred objavo in pustite njegovo konfiguracijo nespremenjeno, dokler ga zahteve uporabljajo.

Ključavnica ščiti le posnetek kazalca, zato počasna zahteva ne drži usmerjevalne ključavnice ves čas svoje omrežne izmenjave. Zahteva, ki že uporablja prejšnji posnetek, nadaljuje na tem prenosniku; preklop je ne ponovi in ne premakne njene povezave.

Stare prenosnike hranite in upokojite skozi omejen življenjski cikel aplikacije, pustite tekočemu delu, da se konča, in po potrebi zaprite nedejavne bazene. Preusmeritev lahko po preklopu povzroči še en RoundTrip. Če celoten potek dela potrebuje eno pot, jo dodelite na meji poteka dela, namesto da ta skupni izbirnik spreminjate na pol poti.

Sorodni članki