اگر کوئی 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 کا سبب بن سکتا ہے۔ اگر پورے ورک فلو کو ایک راستہ درکار ہو، تو اس مشترک سیلیکٹر کو درمیان میں تبدیل کرنے کے بجائے ورک فلو کی حد پر وہ راستہ مقرر کریں۔

متعلقہ مضامین