Атомно разпределяне на най-малко използвания прокси в Redis
Използвайте сортирано множество и кратък Lua скрипт, за да избирате и увеличавате броя разпределения на прокси между работници.
Когато няколко работника споделят пул през Redis, сортирано множество може да реализира проста политика: избиране на допустимия прокси с най-малко записани разпределения. Съхранявайте идентификатора на проксито като член, а броя на разпределенията му като резултат.
За пул, който обслужва разрешени публични заявки, списъкът с безплатни проксита може да предостави кандидати за крайни точки, които да бъдат оценени по правилата за допустимост на този пул. Инициализирайте допустимите членове със съгласуван начален брой. След това направете избора и увеличението една сървърна операция:
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Подайте ключа на сортираното множество като единствения ключов аргумент на скрипта през интерфейса EVAL на вашия Redis клиент. Празният пул връща резултат null, който приложението трябва да обработи, без да прави заявка.
Защо да комбинираме двете команди?
Отделните четения и увеличения позволяват на двама работника да видят еднакъв минимум, преди някой да го обнови. Redis изпълнява Lua скрипт атомарно, така че друг работник не може да вмъкне избор между четенето и увеличението на този скрипт. Пазете скрипта кратък, защото изпълнението му блокира друга работа на Redis.
ZRANGE връща най-ниския резултат първи; равните резултати се решават по реда на членовете, а не случайно. ZINCRBY увеличава резултата на избрания член с единица за следващото разпределение.
Определете какво означава резултатът
Това брои разпределения, включително разпределение, чиято мрежова заявка по-късно се провали. Не измерва закъснение, успешни заявки или работа, която тече в момента. Повтарящото се избиране на единствения допустим член все още е възможно; скриптът не го резервира изключително.
Поддържайте допустимостта чрез правилата за здраве и политика на пула. Ако премахнете член и по-късно го възстановите, решете дали историческият му брой да се запази. Стартирането на възстановено прокси от нула може да концентрира разпределения върху него, докато то наваксва.
Политиката за най-малка едновременност изисква различен жизнен цикъл, включително приключване и обработка на изоставени задачи. Не тълкувайте този кумулативен брояч като такъв жизнен цикъл.