Atomiškai priskirti mažiausiai naudojamą tarpinį serverį Redis
Naudokite surikiuotą aibę ir trumpą Lua scenarijų, kad parinktumėte ir padidintumėte tarpinio serverio priskyrimų skaičių tarp darbuotojų.
Kai keli darbuotojai dalijasi telkiniu per Redis, surikiuota aibė gali įgyvendinti paprastą taisyklę: pasirinkti tinkamą tarpinį serverį, turintį mažiausiai užregistruotų priskyrimų. Saugokite tarpinio serverio identifikatorių kaip narį, o jo priskyrimų skaičių kaip balą.
Telkiniui, aptarnaujančiam leidžiamas viešas užklausas, nemokamų tarpinių serverių sąrašas gali pateikti galinių taškų kandidatus, kuriuos reikia įvertinti pagal to telkinio tinkamumo taisykles. Inicializuokite tinkamus narius sutartu pradiniu skaičiumi. Tada padarykite parinkimą ir padidinimą viena serverio operacija:
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 chosenPerduokite surikiuotos aibės raktą kaip vienintelį scenarijaus rakto argumentą per savo Redis kliento EVAL sąsają. Tuščias telkinys grąžina null rezultatą, kurį programa turi apdoroti nesiųsdama užklausos.
Kodėl sujungti abi komandas?
Atskiri skaitymai ir padidinimai leidžia dviem darbuotojams matyti tą patį minimumą, kol nė vienas jo neatnaujina. Redis vykdo Lua scenarijų atomiškai, todėl kitas darbuotojas negali įterpti pasirinkimo tarp šio scenarijaus skaitymo ir padidinimo. Laikykite scenarijų trumpą, nes jo vykdymas blokuoja kitą Redis darbą.
ZRANGE grąžina mažiausią balą pirmą; lygūs balai sprendžiami narių tvarka, ne atsitiktinai. ZINCRBY padidina pasirinkto nario balą vienetu kitam priskyrimui.
Apibrėžkite, ką reiškia balas
Tai skaičiuoja priskyrimus, įskaitant priskyrimą, kurio tinklo užklausa vėliau nepavyksta. Tai nematuoja delsos, sėkmingų užklausų ar šiuo metu vykstančio darbo. Vis dar įmanoma pakartotinai rinktis vienintelį tinkamą narį; scenarijus jo neišsaugo išimtinai.
Palaikykite tinkamumą pagal telkinio būklės ir politikos taisykles. Jei pašalinsite narį ir vėliau jį atkursite, nuspręskite, ar išsaugoti jo istorinį skaičių. Atkurto tarpinio serverio paleidimas nuo nulio gali sutelkti priskyrimus jam, kol jis pasiveja.
Mažiausio vienalaikiškumo politikai reikia kito gyvavimo ciklo, įskaitant užbaigimą ir apleistų užduočių tvarkymą. Nelaikykite šio kaupiamojo skaitiklio tuo gyvavimo ciklu.