Ако http.Client већ деле паралелни захтеви, држите његово поље Transport стабилним. Омотач може да синхронизује који потпуно конфигурисани транспорт добија свако наредно кружење:

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

Уз net/http и sync, иницијализујте га пре објављивања клијента:

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

slot.Set(nextTransport)

initialTransport и nextTransport морају бити non-nil, потпуно конфигурисани и безбедни за паралелност извршиоци кружења. Изградите сваки прокси транспорт пре објављивања и оставите његову конфигурацију непромењеном док га захтеви користе.

Брава штити само снимак показивача, па спор захтев не држи браву рутирања током целе мрежне размене. Захтев који већ користи претходни снимак наставља на том транспорту; пребацивање га не понавља нити помера његову везу.

Задржавајте и умировљујте старе транспорте кроз ограничени животни циклус апликације, допуштајући да посао у току заврши и затварајући неактивне скупове када је прикладно. Преусмеравање може изазвати још једно RoundTrip након пребацивања. Ако цео ток рада захтева једну руту, доделите је на граници тока рада уместо да мењате овај заједнички бирач на пола пута.

Повезани чланци