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 chosen

Perduokite 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.

Susiję straipsniai