Kui http.Client on juba samaaegsete päringute vahel jagatud, hoidke selle Transport-väli stabiilsena. Mähist saab sünkroonida, millise täielikult seadistatud transpori saab iga järgnev edasi-tagasi käik:

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

Kasutades net/http ja sync, lähtestage see enne kliendi avaldamist:

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

slot.Set(nextTransport)

initialTransport ja nextTransport peavad olema mitte-nil, täielikult seadistatud ja samaaegsuse suhtes ohutud käigu sooritajad. Ehitage iga puhverserveri transport enne selle avaldamist ja jätke selle seadistus muutmata, kuni päringud seda kasutavad.

Lukk kaitseb ainult osuti hetktõmmist, seega aeglane päring ei hoia marsruutimise lukku kogu oma võrguvahetuse vältel. Päring, mis juba kasutab eelmist hetktõmmist, jätkab sellel transpordil; lülitus ei korda seda ega liiguta selle ühendust.

Hoidke ja kasutage vanu transporte rakenduse piiratud elutsükli jooksul, lubades poolelioleval tööl lõppeda ja sulgedes vajadusel jõudeolevad varamud. Ümbersuunamine võib pärast lülitust põhjustada veel ühe RoundTripi. Kui terve töövoog vajab ühte marsruuti, määrake see töövoo piiril, selle asemel et seda jagatud valijat poole peal muuta.

Seotud artiklid