Client.Transport না বদলে Go HTTP প্রক্সি রুট বদলান
সচল http.Client ফিল্ড না বদলে নতুন কনফিগার করা প্রক্সি ট্রান্সপোর্ট প্রকাশ করতে একটি সিঙ্ক্রোনাইজড RoundTripper র্যাপার ব্যবহার করুন।
যদি একটি 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 ঘটাতে পারে। যদি পুরো একটি ওয়ার্কফ্লো একটি রুট চায়, তাহলে এই ভাগ করা সিলেক্টরটি মাঝপথে বদলানোর বদলে ওয়ার্কফ্লোর সীমায় সেই রুট নির্ধারণ করুন।