Assegnare atomicamente il proxy meno usato in Redis
Usate un insieme ordinato e un breve script Lua per scegliere e incrementare il conteggio delle assegnazioni di un proxy tra i worker.
Quando più worker condividono un pool tramite Redis, un insieme ordinato può implementare una politica semplice: scegliere il proxy idoneo con il minor numero di assegnazioni registrate. Memorizzate l'identificatore del proxy come membro e il suo conteggio delle assegnazioni come punteggio.
Per un pool che serve richieste pubbliche consentite, il elenco dei proxy gratuiti può fornire candidati endpoint da valutare secondo le regole di idoneità di quel pool. Inizializzate i membri idonei con un conteggio iniziale concordato. Poi rendete selezione e incremento un'unica operazione lato server:
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 chosenPassate la chiave dell'insieme ordinato come unico argomento chiave dello script tramite l'interfaccia EVAL del vostro client Redis. Un pool vuoto produce un risultato null che l'applicazione deve gestire senza effettuare richieste.
Perché combinare i due comandi?
Letture e incrementi separati permettono a due worker di osservare lo stesso minimo prima che uno dei due lo aggiorni. Redis esegue uno script Lua in modo atomico, quindi un altro worker non può inserire una selezione tra la lettura e l'incremento di questo script. Mantenete lo script breve perché la sua esecuzione blocca altro lavoro di Redis.
ZRANGE restituisce prima il punteggio più basso; i punteggi uguali vengono risolti dall'ordine dei membri, non casualmente. ZINCRBY aumenta di uno il punteggio del membro scelto per l'assegnazione successiva.
Definite cosa significa il punteggio
Questo conta le assegnazioni, inclusa un'assegnazione la cui richiesta di rete fallisce in seguito. Non misura latenza, richieste riuscite o lavoro in corso. Scegliere ripetutamente l'unico membro idoneo resta possibile; lo script non lo riserva in esclusiva.
Mantenete l'idoneità con le regole di salute e di politica del pool. Se rimuovete un membro e poi lo ripristinate, decidete se conservarne il conteggio storico. Avviare un proxy ripristinato da zero può concentrare su di esso le assegnazioni mentre recupera.
Una politica di minima concorrenza richiede un ciclo di vita diverso, inclusi completamento e gestione dei lavori abbandonati. Non interpretate questo contatore cumulativo come quel ciclo di vita.