Ef http.Client er þegar deilt af samhliða beiðnum skaltu halda Transport svæðinu stöðugu. Umbúðirnar geta samstillt hvaða fullstillti flutningsaðili fær hverja síðari ferð:

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

Með net/http og sync skaltu frumstilla hann áður en biðlarinn er birtur:

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

slot.Set(nextTransport)

initialTransport og nextTransport verða að vera ekki-nil, fullstilltir og öruggir með tilliti til samhliða keyrslu. Byggðu hvern proxy flutningsaðila áður en hann er birtur og lát stillingar hans óbreyttar meðan beiðnir nota hann.

Lásinn verndar aðeins bendisneiðmyndina, svo hæg beiðni heldur ekki leiðarlásnum allan sinn netskipti. Beiðni sem þegar notar fyrri sneiðmyndina heldur áfram á þeim flutningsaðila; skiptingin endurspilar hana ekki né færir tengingu hennar.

Haltu og lætur gamla flutningsaðila fara í gegnum takmarkaðan lífsferil forritsins, leyfðu vinnu í gangi að klárast og lokaðu aðgerðalausum laugum þegar við á. Endurbeining getur valdið annarri RoundTrip eftir skiptingu. Ef heilt vinnuflæði þarf eina leið skaltu úthluta þeirri leið við mörk vinnuflæðisins í stað þess að breyta þessum sameiginlega vali um mitt.

Tengdir greinar