Wann en http.Client schonn duerch gläichzäiteg Ufroe gedeelt gëtt, halen säin Transport-Feld stabil. Eng Ëmhüllung kann synchroniséieren, wéi en Transport, dee vollstänneg konfiguréiert ass, all weider Hi- an Herrees kritt:

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

Mat net/http a sync initialiséiert een et, ier de Client publizéiert gëtt:

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

slot.Set(nextTransport)

initialTransport an nextTransport mussen non-nil, vollstänneg konfiguréiert a gläichzäiteg sécher Hi- an Herausféierer sinn. Baut all Proxy-Transport, ier en publizéiert gëtt, a loosst seng Konfiguratioun onverännert, wärend Ufroe se benotzen.

De Spär schützt nëmmen de Pointer-Snapshot, sou datt eng lues Ufro de Routing-Spär net wärend hirem ganzen Netzwierkaustausch hält. Eng Ufro, déi schonn de virege Snapshot benotzt, geet op deem Transport weider; d'Ëmschaltung spillt se net nach eng Kéier of a verréckelt och net hir Verbindung.

Halt a pensionéiert al Transporten duerch de limitéierten Liewenszyklus vun der Applikatioun, loosst lafend Aarbecht fäerdeg ginn a schléisst Idle-Pools, wann et geet. Eng Ëmleitung kann no enger Ëmschaltung nach eng RoundTrip verursaachen. Wann e ganzen Workflow eng Streck brauch, weist déi Streck op der Grenz vum Workflow zou, amplaz dëse gedeelte Selekter an der Mëtt ze änneren.

Ähnlech Artikelen