Əgər http.Client artıq paralel sorğular tərəfindən paylaşılırsa, onun Transport sahəsini sabit saxlayın. Sarğı sonrakı hər gediş-gəlişin hansı tam konfiqurasiya edilmiş nəqliyyatı alacağını sinxronlaşdıra bilər:

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 və sync istifadə edərək, müştərini yayımlamazdan əvvəl onu işə salın:

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

slot.Set(nextTransport)

initialTransport və nextTransport nil olmamalı, tam konfiqurasiya edilməli və paralelliyə davamlı gediş-gəliş icraçıları olmalıdır. Hər proksi nəqliyyatı yayımlamazdan əvvəl qurun və sorğular ondan istifadə edərkən konfiqurasiyasını dəyişməz buraxın.

Kilid yalnız göstərici snapshotunu qoruyur, ona görə də yavaş sorğu bütün şəbəkə mübadiləsi boyunca marşrutlaşdırma kilidini saxlamır. Əvvəlki snapshotdan istifadə edən sorğu həmin nəqliyyatla davam edir; keçid onu yenidən oynatmır və ya bağlantısını köçürmür.

Köhnə nəqliyyatları tətbiqin məhdud həyat dövrü boyunca saxlayın və təqaüdə çıxarın, icradakı işin bitməsinə imkan verin və lazım olduqda boş hovuzları bağlayın. Yönləndirmə keçiddən sonra başqa bir RoundTrip yarada bilər. Əgər bütöv bir iş axını bir marşrut tələb edirsə, bu paylaşılan seçicini ortada dəyişmək əvəzinə marşrutu iş axınının sərhədində təyin edin.

Əlaqəli məqalələr