Ako http.Client već dijele paralelni zahtjevi, držite njegovo polje Transport stabilnim. Omotač može sinhronizovati koji potpuno konfigurisani transport dobija svako naredno kruženje:

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

Uz net/http i sync, inicijalizujte ga prije objavljivanja klijenta:

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

slot.Set(nextTransport)

initialTransport i nextTransport moraju biti non-nil, potpuno konfigurisani i bezbjedni za paralelnost izvršioci kruženja. Izgradite svaki proxy transport prije objavljivanja i ostavite njegovu konfiguraciju nepromijenjenom dok ga zahtjevi koriste.

Brava štiti samo snimak pokazivača, pa spor zahtjev ne drži bravu rutiranja tokom cijele mrežne razmjene. Zahtjev koji već koristi prethodni snimak nastavlja na tom transportu; prebacivanje ga ne ponavlja niti pomjera njegovu vezu.

Zadržavajte i umirovljujte stare transporte kroz ograničeni životni ciklus aplikacije, dopuštajući da posao u toku završi i zatvarajući neaktivne skupove kada je prikladno. Preusmjeravanje može izazvati još jedno RoundTrip nakon prebacivanja. Ako cijeli tok rada zahtijeva jednu rutu, dodijelite je na granici toka rada umjesto da mijenjate ovaj zajednički birač na pola puta.

Povezani članci