Gdy kilku workerów współdzieli pulę przez Redis, posortowany zbiór może realizować prostą politykę: wybierać dopuszczalne proxy z najmniejszą liczbą zapisanych przydziałów. Przechowuj identyfikator proxy jako element, a liczbę jego przydziałów jako wynik.

Dla puli obsługującej dozwolone publiczne żądania lista darmowych proxy może dostarczyć kandydatów punktów końcowych do oceny według reguł dopuszczalności tej puli. Zainicjuj dopuszczalne elementy uzgodnioną wartością początkową. Następnie połącz wybór i zwiększenie w jedną operację po stronie serwera:

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

Przekaż klucz posortowanego zbioru jako jedyny argument klucza skryptu przez interfejs EVAL klienta Redis. Pusta pula zwraca wynik null, który aplikacja musi obsłużyć bez wysyłania żądania.

Dlaczego łączyć oba polecenia?

Oddzielne odczyty i zwiększenia pozwalają dwóm workerom zobaczyć to samo minimum, zanim którykolwiek je zaktualizuje. Redis wykonuje skrypt Lua atomowo, więc inny worker nie może wstawić wyboru między odczyt i zwiększenie tego skryptu. Utrzymuj skrypt krótki, ponieważ jego wykonanie blokuje inną pracę Redisa.

ZRANGE zwraca najniższy wynik jako pierwszy; równe wyniki rozstrzyga kolejność elementów, a nie losowość. ZINCRBY zwiększa wynik wybranego elementu o jeden na potrzeby następnego przydziału.

Zdefiniuj, co oznacza wynik

To liczy przydziały, także przydział, którego żądanie sieciowe później kończy się niepowodzeniem. Nie mierzy opóźnienia, udanych żądań ani pracy w toku. Wielokrotne wybieranie jedynego dopuszczalnego elementu nadal jest możliwe; skrypt nie rezerwuje go wyłącznie.

Utrzymuj dopuszczalność zgodnie z regułami kondycji i polityki puli. Jeśli usuniesz element i później go przywrócisz, zdecyduj, czy zachować jego historyczną liczbę. Uruchomienie przywróconego proxy od zera może skupić na nim przydziały, dopóki nie nadrobi zaległości.

Polityka najmniejszej współbieżności wymaga innego cyklu życia, w tym zakończenia i obsługi porzuconych zadań. Nie interpretuj tego narastającego licznika jako tego cyklu życia.

Powiązane artykuły