Ако 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 мора да бидат не-nil, целосно конфигурирани и безбедни за паралелност извршители на кружења. Изградете го секој прокси транспорт пред да го објавите и оставете ја неговата конфигурација непроменета додека барањата го користат.

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

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

Поврзани статии