जब कई वर्कर 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 अगले आवंटन के लिए चुने गए सदस्य का स्कोर एक बढ़ा देता है।

स्कोर का अर्थ निर्धारित करें

यह आवंटन गिनता है, उस आवंटन सहित जिसका नेटवर्क अनुरोध बाद में विफल होता है। यह विलंब, सफल अनुरोध या वर्तमान में चल रहे कार्य को नहीं मापता। एकमात्र पात्र सदस्य को बार-बार चुनना अभी भी संभव है; स्क्रिप्ट उसे विशेष रूप से आरक्षित नहीं करती।

पूल के स्वास्थ्य और नीति नियमों से पात्रता बनाए रखें। यदि आप कोई सदस्य हटाते हैं और बाद में बहाल करते हैं, तो तय करें कि उसकी ऐतिहासिक गणना रखी जानी चाहिए या नहीं। बहाल किए गए प्रॉक्सी को शून्य से शुरू करने पर वह पकड़ बनाते समय आवंटन उस पर केंद्रित हो सकते हैं।

न्यूनतम-समवर्ती नीति के लिए भिन्न जीवनचक्र चाहिए, जिसमें पूर्णता और परित्यक्त कार्यों का प्रबंधन शामिल है। इस संचयी गणक को वह जीवनचक्र न समझें।

संबंधित लेख