Ατομική εκχώρηση του λιγότερο χρησιμοποιημένου proxy στο Redis
Χρησιμοποιήστε ένα ταξινομημένο σύνολο και ένα σύντομο σκριπτ Lua για να επιλέγετε και να αυξάνετε τον μετρητή εκχωρήσεων ενός proxy μεταξύ των εργαζομένων.
Όταν πολλοί εργαζόμενοι μοιράζονται μια δεξαμενή μέσω Redis, ένα ταξινομημένο σύνολο μπορεί να υλοποιήσει μια απλή πολιτική: επιλογή του επιλέξιμου proxy με τις λιγότερες καταγεγραμμένες εκχωρήσεις. Αποθηκεύστε το αναγνωριστικό του proxy ως μέλος και τον μετρητή εκχωρήσεών του ως βαθμολογία.
Για μια δεξαμενή που εξυπηρετεί επιτρεπόμενα δημόσια αιτήματα, η λίστα δωρεάν proxy μπορεί να παρέχει υποψήφια τελικά σημεία προς αξιολόγηση σύμφωνα με τους κανόνες επιλεξιμότητας αυτής της δεξαμενής. Αρχικοποιήστε τα επιλέξιμα μέλη με έναν συμφωνημένο αρχικό μετρητή. Στη συνέχεια κάντε την επιλογή και την αύξηση μία διαδικασία στην πλευρά του διακομιστή:
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 αυξάνει τη βαθμολογία του επιλεγμένου μέλους κατά ένα για την επόμενη εκχώρηση.
Ορίστε τι σημαίνει η βαθμολογία
Αυτό μετρά εκχωρήσεις, συμπεριλαμβανομένης μιας εκχώρησης της οποίας το δικτυακό αίτημα αποτυγχάνει αργότερα. Δεν μετρά καθυστέρηση, επιτυχημένα αιτήματα ή εργασία που βρίσκεται σε εξέλιξη. Η επανειλημμένη επιλογή του μοναδικού επιλέξιμου μέλους παραμένει δυνατή· το σκριπτ δεν το δεσμεύει αποκλειστικά.
Διατηρήστε την επιλεξιμότητα με τους κανόνες υγείας και πολιτικής της δεξαμενής. Αν αφαιρέσετε ένα μέλος και το επαναφέρετε αργότερα, αποφασίστε αν πρέπει να διατηρηθεί ο ιστορικός μετρητής του. Η εκκίνηση ενός επαναφερόμενου proxy στο μηδέν μπορεί να συγκεντρώσει εκχωρήσεις σε αυτό όσο καλύπτει τη διαφορά.
Μια πολιτική ελάχιστης ταυτοχρονίας απαιτεί διαφορετικό κύκλο ζωής, συμπεριλαμβανομένης της ολοκλήρωσης και του χειρισμού εγκαταλελειμμένων εργασιών. Μην ερμηνεύετε αυτόν τον σωρευτικό μετρητή ως εκείνον τον κύκλο ζωής.