Nëse një http.Client ndahet tashmë nga kërkesa paralele, mbani fushën e tij Transport të qëndrueshme. Një mbështjellës mund të sinkronizojë cili transport plotësisht i konfiguruar merr çdo vajtje-ardhje pasuese:

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 dhe sync, inicializojeni para se të publikoni klientin:

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

slot.Set(nextTransport)

initialTransport dhe nextTransport duhet të jenë jo-nil, plotësisht të konfiguruar dhe të sigurt ndaj paralelizmit. Ndërtoni çdo transport proxy para se ta publikoni dhe lini konfigurimin e tij të pandryshuar ndërsa kërkesat e përdorin.

Kyçja mbron vetëm pamjen e treguesit, kështu që një kërkesë e ngadaltë nuk e mban kyçjen e rrugëzimit gjatë gjithë shkëmbimit të saj të rrjetit. Një kërkesë që përdor tashmë pamjen e mëparshme vazhdon në atë transport; ndërrimi nuk e riekzekuton atë dhe nuk e zhvendos lidhjen e saj.

Mbani dhe tërhiqni transportet e vjetra përmes ciklit të kufizuar të jetës së aplikacionit, duke lejuar përfundimin e punës në rrjedhë dhe duke mbyllur grupet e papunë kur është e përshtatshme. Një ridrejtim mund të shkaktojë një RoundTrip tjetër pas një ndërrimi. Nëse një rrjedhë e tërë punë kërkon një rrugë të vetme, caktojeni atë në kufirin e rrjedhës së punës në vend që të ndryshoni këtë përzgjedhës të përbashkët në mes të rrugës.

Artikuj të ngjashëm