Атомски доделити најмање коришћени прокси у 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 повећава резултат изабраног члана за један за следећу доделу.
Дефинишите шта резултат значи
Ово броји доделе, укључујући доделу чији мрежни захтев касније не успе. Не мери кашњење, успешне захтеве ни рад који је управо у току. Поновно одабирање јединог подобног члана и даље је могуће; скрипта га не резервише искључиво.
Одржавајте подобност правилима здравља и политике пула. Ако уклоните члана и касније га вратите, одлучите треба ли задржати његов историјски број. Покретање враћеног проксија од нуле може концентрисати доделе на њему док сустиже.
Политика најмање истовремености захтева другачији животни циклус, укључујући довршење и руковање напуштеним пословима. Не тумачите овај кумулативни бројач као тај животни циклус.