একটি সিলেক্টর নিখুঁতভাবে ঘুরেও প্রথম প্রক্সিটিই বেছে নিতে পারে। ভুলটি হলো প্রতিটি অনুরোধের জন্য ভুলবশত নতুন সিলেক্টর তৈরি করা, যা দ্বিতীয়বার বেছে নেওয়ার আগেই তার কাউন্টার রিসেট করে দেয়।

সিলেক্টরটি একবার তৈরি করুন এবং ট্রান্সপোর্টের সঙ্গে রাখুন। HTTP প্রক্সি তালিকা অনুরোধগুলো পাবলিক মধ্যস্থতাকারী অনুমোদন করলে URL সেটের জন্য পাবলিক HTTP প্রার্থী জোগাতে পারে। আগেই যাচাই করা, খালি নয় এমন প্রক্সি URL তালিকা দিয়ে শুরু করুন:

func rotatingProxy(urls []*url.URL) func(*http.Request) (*url.URL, error) {
    var mu sync.Mutex
    next := 0
    return func(*http.Request) (*url.URL, error) {
        mu.Lock()
        selected := urls[next]
        next = (next + 1) % len(urls)
        mu.Unlock()
        return selected, nil
    }
}

আবেষ্টক অ্যাপ্লিকেশনকে অবশ্যই খালি তালিকা প্রত্যাখ্যান করতে হবে, URL যাচাই করতে হবে এবং স্বাভাবিক net/http, net/url ও sync ইমপোর্ট ব্যবহার করতে হবে। এই সিলেক্টর এটি ব্যবহার করার সময় তালিকাটি অপরিবর্তনীয় থাকা উচিত, অথবা আলাদাভাবে সিঙ্ক্রোনাইজ করা নকশার মাধ্যমে প্রতিস্থাপিত হওয়া উচিত।

ফেরত দেওয়া ফাংশনটি একটি সংরক্ষিত http.Transport-এ যুক্ত করুন। মিউটেক্স সমবর্তী কলব্যাক জুড়ে নির্বাচনের ক্রম রক্ষা করে। ধীর নেটওয়ার্ক অনুরোধ শেষ হওয়ার সময় এটি লক ধরে রাখা প্রয়োজন করে না।

শুধু ছাপানোর জন্য কোনো রুট ব্যবহার করবেন না

ডায়াগনস্টিক বার্তার জন্য আবার সিলেক্টর ডাকলে কাউন্টার আবার এগিয়ে যায়। ওই আউটপুট আপনার তদন্তাধীন অনুরোধ যে প্রার্থী ব্যবহার করেছে তার বদলে পরবর্তী প্রার্থীর বর্ণনা দিতে পারে। প্রকৃত কলব্যাকের ভিতরে নিরাপদ এন্ডপয়েন্ট শনাক্তকারী দিয়ে নির্বাচনটি লিপিবদ্ধ করুন।

কলব্যাক আহ্বান করা কোনো অনুরোধ সফলভাবে পৌঁছানোর প্রমাণ নয়। রিডাইরেক্ট বা অতিরিক্ত ট্রান্সপোর্ট চেষ্টা “একটি অ্যাপ্লিকেশন কল, একটি বাছাই” এই সরল ধারণাকে জটিল করতে পারে। যদি কোনো ওয়ার্কফ্লোকে কয়েকটি কাজ জুড়ে একটি রুট ধরে রাখতে হয়, তবে বিশ্বব্যাপী ঘূর্ণায়মান কলব্যাক ব্যবহার না করে ওয়ার্কফ্লোর সীমায় সেই রুটটি বেছে নিন।

রাউন্ড-রবিন আলাদা পাবলিক নির্গমনের প্রতিশ্রুতিও দেয় না। এটি এন্ডপয়েন্টগুলোর সময়সূচি করে। চূড়ান্ত পরিচয় প্রতিটি এন্ডপয়েন্ট যে পথ জোগায় তার একটি বৈশিষ্ট্য হয়েই থাকে।

সম্পর্কিত নিবন্ধ