Atomski dodijeliti najmanje korišteni proxy u Redisu
Upotrijebite sortirani skup i kratku Lua skriptu za odabir i povećanje broja dodjela proxyja među radnicima.
Kada više radnika dijeli pool preko Redisa, sortirani skup može provesti jednostavnu politiku: odabrati podoban proxy s najmanje zabilježenih dodjela. Pohranite identifikator proxyja kao člana, a njegov broj dodjela kao rezultat.
Za pool koji poslužuje dopuštene javne zahtjeve, popis besplatnih proxyja može pružiti kandidate za krajnje točke koje treba procijeniti prema pravilima podobnosti tog poola. Inicijalizirajte podobne članove dogovorenim početnim brojem. Zatim napravite odabir i povećanje jednom poslužiteljskom operacijom:
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 chosenProslijedite ključ sortiranog skupa kao jedini argument ključa skripte kroz sučelje EVAL svojeg Redis klijenta. Prazan pool daje null rezultat koji aplikacija mora obraditi bez slanja zahtjeva.
Zašto spojiti dvije naredbe?
Odvojena čitanja i povećanja omogućuju dvama radnicima da vide isti minimum prije nego ga bilo tko ažurira. Redis izvršava Lua skriptu atomski, pa drugi radnik ne može umetnuti odabir između čitanja i povećanja ove skripte. Držite skriptu kratkom jer njezino izvršavanje blokira druge Redis poslove.
ZRANGE vraća najniži rezultat prvi; jednaki se rezultati rješavaju redoslijedom članova, ne slučajno. ZINCRBY povećava rezultat odabranog člana za jedan za sljedeću dodjelu.
Definirajte što rezultat znači
Ovo broji dodjele, uključujući dodjelu čiji mrežni zahtjev kasnije ne uspije. Ne mjeri latenciju, uspješne zahtjeve ni rad koji je upravo u tijeku. Ponovno odabiranje jedinog podobnog člana i dalje je moguće; skripta ga ne rezervira isključivo.
Održavajte podobnost pravilima zdravlja i politike poola. Ako uklonite člana i kasnije ga vratite, odlučite treba li zadržati njegov povijesni broj. Pokretanje vraćenog proxyja od nule može koncentrirati dodjele na njemu dok sustiže.
Politika najmanje istovremenosti zahtijeva drukčiji životni ciklus, uključujući dovršetak i rukovanje napuštenim poslovima. Ne tumačite ovaj kumulativni brojač kao taj životni ciklus.