Atomicky přidělit nejméně používanou proxy v Redis
Použijte seřazenou množinu a krátký skript Lua k výběru a zvýšení počtu přidělení proxy napříč pracovníky.
Když několik pracovníků sdílí fond přes Redis, seřazená množina může zavést jednoduchou politiku: vybrat způsobilou proxy s nejmenším zaznamenaným počtem přidělení. Ukládejte identifikátor proxy jako člena a počet jejích přidělení jako skóre.
Pro fond obsluhující povolené veřejné požadavky může seznam bezplatných proxy poskytnout kandidáty na koncové body k posouzení podle pravidel způsobilosti daného fondu. Inicializujte způsobilé členy dohodnutým počátečním počtem. Poté proveďte výběr a zvýšení jako jednu operaci na straně serveru:
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 chosenPředejte klíč seřazené množiny jako jediný klíčový argument skriptu přes rozhraní EVAL vašeho klienta Redis. Prázdný fond vrací výsledek null, který musí aplikace ošetřit, aniž by odeslala požadavek.
Proč oba příkazy spojovat?
Oddělená čtení a zvýšení umožňují dvěma pracovníkům vidět stejné minimum, než jej některý aktualizuje. Redis provádí skript Lua atomicky, takže jiný pracovník nemůže vložit výběr mezi čtení a zvýšení tohoto skriptu. Udržujte skript krátký, protože jeho provádění blokuje jinou práci Redisu.
ZRANGE vrací nejnižší skóre jako první; stejná skóre se řeší pořadím členů, nikoli náhodně. ZINCRBY zvyšuje skóre vybraného člena o jednu pro další přidělení.
Definujte, co skóre znamená
Počítá přidělení, včetně přidělení, jehož síťový požadavek později selže. Neměří latenci, úspěšné požadavky ani právě probíhající práci. Opakovaný výběr jediného způsobilého člena je stále možný; skript si jej nevyhrazuje výhradně.
Udržujte způsobilost pomocí pravidel zdraví a politiky fondu. Pokud člena odeberete a později obnovíte, rozhodněte, zda má být jeho historický počet zachován. Spuštění obnovené proxy od nuly může soustředit přidělení na ni, dokud se nedohoní.
Politika nejmenší souběžnosti vyžaduje jiný životní cyklus, včetně dokončení a zpracování opuštěných úloh. Nevykládejte tento kumulativní čítač jako takový životní cyklus.