Når flere arbeidere deler en pool gjennom Redis, kan et sortert sett gjennomføre en enkel politikk: velg den kvalifiserte proxyen med færrest registrerte tildelinger. Lagre proxyens identifikator som medlem og tildelingstallet som poengsum.

For en pool som betjener tillatte offentlige forespørsler, kan listen over gratis proxyer gi endepunktkandidater som skal vurderes etter poolens kvalifikasjonsregler. Initialiser kvalifiserte medlemmer med et avtalt starttall. Deretter gjør du valget og økningen til én operasjon på serversiden:

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

Send nøkkelen til det sorterte settet som skriptets eneste nøkkelargument gjennom EVAL-grensesnittet til Redis-klienten din. En tom pool gir et null-resultat som applikasjonen må håndtere uten å sende en forespørsel.

Hvorfor kombinere de to kommandoene?

Adskilte lesinger og økninger lar to arbeidere se samme minimum før noen oppdaterer det. Redis kjører et Lua-skript atomisk, så en annen arbeider kan ikke skyte inn et valg mellom skriptets lesing og økning. Hold skriptet kort fordi kjøringen blokkerer annet Redis-arbeid.

ZRANGE returnerer den laveste poengsummen først; like poengsummer avgjøres av medlemsrekkefølgen, ikke tilfeldig. ZINCRBY øker poengsummen til det valgte medlemmet med én for neste tildeling.

Definer hva poengsummen betyr

Dette teller tildelinger, inkludert en tildeling der nettverksforespørselen senere feiler. Det måler ikke latens, vellykkede forespørsler eller arbeid som pågår. Det er fortsatt mulig å velge det eneste kvalifiserte medlemmet gjentatte ganger; skriptet reserverer det ikke eksklusivt.

Oppretthold kvalifikasjonen med poolens helse- og policyregler. Hvis du fjerner et medlem og senere gjenoppretter det, må du avgjøre om det historiske tallet skal beholdes. Å starte en gjenopprettet proxy på null kan samle tildelinger på den mens den tar igjen.

En politikk for minst samtidighet krever en annen livssyklus, inkludert fullføring og håndtering av forlatte jobber. Ikke tolk denne kumulative telleren som den livssyklusen.

Relaterte artikler