כאשר כמה עובדים חולקים מאגר דרך 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

העבירו את מפתח הקבוצה הממוינת כארגומנט המפתח היחיד של הסקריפט דרך ממשק ה-EVAL של לקוח ה-Redis שלכם. מאגר ריק מפיק תוצאת null שעל היישום לטפל בה בלי לשלוח בקשה.

למה לחבר את שתי הפקודות?

קריאות והעלאות נפרדות מאפשרות לשני עובדים לראות את אותו מינימום לפני שמישהו מעדכן אותו. Redis מריץ סקריפט Lua באופן אטומי, ולכן עובד אחר אינו יכול להכניס בחירה בין הקריאה להעלאה של הסקריפט. שמרו על סקריפט קצר כי הפעלתו חוסמת עבודת Redis אחרת.

ZRANGE מחזיר את הניקוד הנמוך ראשון; ניקודים שווים מוכרעים לפי סדר החברים, לא באקראי. ZINCRBY מעלה את הניקוד של החבר הנבחר באחד עבור ההקצאה הבאה.

הגדירו מה משמעות הניקוד

זה סופר הקצאות, כולל הקצאה שבקשת הרשת שלה תיכשל מאוחר יותר. הוא אינו מודד השהיה, בקשות מוצלחות או עבודה שמתבצעת כעת. בחירה חוזרת של החבר הכשיר היחיד עדיין אפשרית; הסקריפט אינו שומר אותו בלעדית.

שמרו על כשירות באמצעות כללי הבריאות והמדיניות של המאגר. אם תסירו חבר ותשחזרו אותו מאוחר יותר, החליטו אם לשמור את הספירה ההיסטורית שלו. התחלה של פרוקסי משוחזר מאפס עלולה לרכז בו הקצאות בזמן שהוא מדביק את הפער.

מדיניות של פחות מקבילות דורשת מחזור חיים אחר, כולל השלמה וטיפול במשימות נטושות. אל תפרשו את המונה המצטבר הזה כמחזור החיים הזה.

מאמרים קשורים