Atomicky prideľovať najmenej používanú proxy v Redis
Použite zoradenú množinu a krátky skript Lua na výber a zvýšenie počtu pridelení proxy medzi pracovníkmi.
Keď viacerí pracovníci zdieľajú fond cez Redis, zoradená množina môže zaviesť jednoduchú politiku: vybrať spôsobilú proxy s najmenším zaznamenaným počtom pridelení. Ukladajte identifikátor proxy ako člena a počet jej pridelení ako skóre.
Pre fond obsluhujúci povolené verejné požiadavky môže zoznam bezplatných proxy poskytnúť kandidátov na koncové body na posúdenie podľa pravidiel spôsobilosti daného fondu. Inicializujte spôsobilých členov dohodnutým počiatočným počtom. Potom urobte výber a zvýšenie jednou operáciou na strane servera:
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 chosenOdovzdajte kľúč zoradenej množiny ako jediný kľúčový argument skriptu cez rozhranie EVAL vášho klienta Redis. Prázdny fond vracia výsledok null, ktorý musí aplikácia ošetriť bez odoslania požiadavky.
Prečo oba príkazy spájať?
Oddelené čítania a zvýšenia umožňujú dvom pracovníkom vidieť rovnaké minimum, kým ho niekto aktualizuje. Redis vykonáva skript Lua atomicky, takže iný pracovník nemôže vložiť výber medzi čítanie a zvýšenie tohto skriptu. Udržujte skript krátky, pretože jeho vykonávanie blokuje inú prácu Redisu.
ZRANGE vracia najnižšie skóre ako prvé; rovnaké skóre sa rieši poradím členov, nie náhodne. ZINCRBY zvyšuje skóre vybraného člena o jeden pre ďalšie pridelenie.
Definujte, čo skóre znamená
Počíta pridelenia, vrátane pridelenia, ktorého sieťová požiadavka neskôr zlyhá. Nemeria latenciu, úspešné požiadavky ani prácu, ktorá práve prebieha. Opakovaný výber jediného spôsobilého člena je stále možný; skript si ho nevyhradzuje výhradne.
Udržujte spôsobilosť pravidlami zdravia a politiky fondu. Ak člena odoberiete a neskôr obnovíte, rozhodnite, či sa má jeho historický počet zachovať. Spustenie obnovenej proxy od nuly môže sústrediť pridelenia na ňu, kým sa dobehne.
Politika najmenšej súbežnosti vyžaduje iný životný cyklus, vrátane dokončenia a spracovania opustených úloh. Neinterpretujte tento kumulatívny počítadlo ako ten životný cyklus.