Bir http.Client zaten eşzamanlı istekler tarafından paylaşılıyorsa, Transport alanını kararlı tutun. Sarmalayıcı, sonraki her gidiş-dönüşün hangi tam yapılandırılmış taşıyıcıyı alacağını eşitleyebilir:

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 ve sync kullanarak, istemciyi yayımlamadan önce onu başlatın:

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

slot.Set(nextTransport)

initialTransport ve nextTransport nil olmamalı, tam yapılandırılmış ve eşzamanlılığa dayanıklı olmalıdır. Her proxy taşıyıcısını yayımlamadan önce oluşturun ve istekler onu kullanırken yapılandırmasını değiştirmeyin.

Kilit yalnızca işaretçi anlık görüntüsünü korur, bu nedenle yavaş bir istek tüm ağ alışverişi boyunca yönlendirme kilidini tutmaz. Önceki anlık görüntüyü kullanan bir istek o taşıyıcıda devam eder; değişiklik onu yeniden çalıştırmaz veya bağlantısını taşımaz.

Eski taşıyıcıları uygulamanın sınırlı yaşam döngüsü boyunca saklayın ve devre dışı bırakın, sürmekte olan işin bitmesine izin verin ve uygun olduğunda boşta havuzları kapatın. Bir yönlendirme, değişiklikten sonra başka bir RoundTrip'e yol açabilir. Bütün bir iş akışı tek bir rota gerektiriyorsa, bu paylaşılan seçiciyi yolun ortasında değiştirmek yerine rotayı iş akışı sınırında atayın.

İlgili makaleler