Jekk http.Client diġà huwa maqsum bejn talbiet konkorrenti, żomm il-qasam Transport tiegħu stabbli. Tgeżwir jista' jissinkronizza liema trasport konfigurat għal kollox jirċievi kull vjaġġ suċċessiv:

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

B'net/http u sync, inizjalizzah qabel ma tippubblika l-klijent:

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

slot.Set(nextTransport)

initialTransport u nextTransport għandhom ikunu mhux nil, konfigurati għal kollox u sikuri għall-konkorrenza. Ibni kull trasport tal-proxy qabel ma tippubblikah, u ħalli l-konfigurazzjoni tiegħu ma tinbidilx waqt li t-talbiet jużawh.

Il-lock jipproteġi biss is-snapshot tal-pointer, għalhekk talba bil-mod ma żżommx il-lock tar-rotot matul l-iskambju kollu tan-netwerk tagħha. Talba li diġà tuża s-snapshot preċedenti tkompli fuq dak it-trasport; il-bidla ma terġax tħaddimha u lanqas ma ċċaqlaq il-konnessjoni tagħha.

Żomm u rtira trasporti qodma permezz taċ-ċiklu tal-ħajja limitat tal-applikazzjoni, ħalli x-xogħol li għaddej jitlesta u agħlaq il-pools bla xogħol meta jkun xieraq. Ridirezzjoni tista' tikkawża RoundTrip ieħor wara bidla. Jekk fluss tax-xogħol sħiħ jeħtieġ rotta waħda, assenja dik ir-rotta fi l-fruntiera tal-fluss tax-xogħol minflok ma tbiddel dan is-selettur maqsum f'nofs triq.

Artikli relatati