যখন একাধিক কর্মী Redis-এর মাধ্যমে একটি পুল ভাগ করে, তখন একটি সাজানো সেট সহজ নীতি প্রয়োগ করতে পারে: সবচেয়ে কম নথিভুক্ত বরাদ্দ থাকা যোগ্য প্রক্সিটি বেছে নিন। প্রক্সির শনাক্তকারীকে সদস্য এবং তার বরাদ্দ সংখ্যাকে স্কোর হিসেবে সংরক্ষণ করুন।

অনুমোদিত সর্বজনীন অনুরোধ পরিবেশনকারী পুলের জন্য, বিনামূল্যের প্রক্সি তালিকা সেই পুলের যোগ্যতার নিয়ম অনুযায়ী মূল্যায়নের জন্য এন্ডপয়েন্ট প্রার্থী সরবরাহ করতে পারে। যোগ্য সদস্যদের সম্মত প্রারম্ভিক সংখ্যা দিয়ে আরম্ভ করুন। তারপর নির্বাচন ও বৃদ্ধিকে একক সার্ভার-সাইড কাজ করুন:

local chosen = redis.call('ZRANGE', KEYS[1], 0, 0)[1]
if not chosen then
    return nil
end

redis.call('ZINCRBY', KEYS[1], 1, chosen)
return chosen

সাজানো সেটের কী-টি স্ক্রিপ্টের একক কী আর্গুমেন্ট হিসেবে আপনার Redis ক্লায়েন্টের EVAL ইন্টারফেসের মাধ্যমে পাঠান। খালি পুল null ফলাফল দেয়, যা অ্যাপ্লিকেশনকে কোনো অনুরোধ না করেই সামলাতে হবে।

দুটি কমান্ড কেন একত্র করবেন?

আলাদা পাঠ ও বৃদ্ধি দুই কর্মীকে একই ন্যূনতম দেখতে দেয়, তার আগে যে কেউ তা হালনাগাদ করে। Redis একটি Lua স্ক্রিপ্ট পারমাণবিকভাবে চালায়, তাই এই স্ক্রিপ্টের পাঠ ও বৃদ্ধির মধ্যে অন্য কর্মী কোনো নির্বাচন প্রবেশ করাতে পারে না। স্ক্রিপ্টটি সংক্ষিপ্ত রাখুন, কারণ এর সম্পাদন অন্য Redis কাজ বাধা দেয়।

ZRANGE সর্বনিম্ন স্কোর আগে ফেরায়; সমান স্কোর সদস্য ক্রমে সমাধান হয়, এলোমেলোভাবে নয়। ZINCRBY পরবর্তী বরাদ্দের জন্য নির্বাচিত সদস্যের স্কোর এক বাড়ায়।

স্কোরের অর্থ নির্ধারণ করুন

এটি বরাদ্দ গণনা করে, যার মধ্যে সেই বরাদ্দও আছে যার নেটওয়ার্ক অনুরোধ পরে ব্যর্থ হয়। এটি লেটেন্সি, সফল অনুরোধ বা চলমান কাজ মাপে না। একমাত্র যোগ্য সদস্য বারবার নির্বাচন করা এখনও সম্ভব; স্ক্রিপ্ট এটি একচেটিয়াভাবে সংরক্ষণ করে না।

পুলের স্বাস্থ্য ও নীতি নিয়ম ব্যবহার করে যোগ্যতা বজায় রাখুন। যদি কোনো সদস্য সরিয়ে পরে পুনরুদ্ধার করেন, তবে তার ঐতিহাসিক গণনা রাখা উচিত কি না তা ঠিক করুন। পুনরুদ্ধার করা প্রক্সি শূন্য থেকে শুরু করলে সেটি ঘুরে দাঁড়ানোর সময় বরাদ্দ তার উপর কেন্দ্রীভূত হতে পারে।

সর্বনিম্ন-সমকালীন নীতির জন্য ভিন্ন জীবনচক্র দরকার, যার মধ্যে সমাপ্তি ও পরিত্যক্ত কাজের ব্যবস্থাপনা রয়েছে। এই সঞ্চিত গণনাকে সেই জীবনচক্র হিসেবে ব্যাখ্যা করবেন না।

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