როცა რამდენიმე მუშაკი 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

გადაეცით დალაგებული სიმრავლის გასაღები როგორც სკრიპტის ერთადერთი გასაღების არგუმენტი თქვენი Redis კლიენტის EVAL ინტერფეისით. ცარიელი აუზი აბრუნებს null შედეგს, რომელიც აპლიკაციამ მოთხოვნის გაგზავნის გარეშე უნდა დაამუშაოს.

რატომ გავაერთიანოთ ორი ბრძანება?

ცალკე კითხვა და ზრდა ორ მუშაკს საშუალებას აძლევს დაინახოს იგივე მინიმუმი, სანამ რომელიმე განაახლებს. Redis Lua სკრიპტს ატომურად ასრულებს, ამიტომ სხვა მუშაკი ვერ ჩასვამს არჩევანს ამ სკრიპტის კითხვასა და ზრდას შორის. შეინახეთ სკრიპტი მოკლე, რადგან მისი შესრულება სხვა Redis სამუშაოს ბლოკავს.

ZRANGE ყველაზე დაბალ ქულას პირველს აბრუნებს; თანაბარი ქულები წევრების რიგით წყდება, არა შემთხვევით. ZINCRBY არჩეული წევრის ქულას ერთით ზრდის შემდეგი განაწილებისთვის.

განსაზღვრეთ, რას ნიშნავს ქულა

ეს ითვლის განაწილებებს, მათ შორის იმ განაწილებას, რომლის ქსელური მოთხოვნა მოგვიანებით ვერ სრულდება. ის არ ზომავს შეყოვნებას, წარმატებულ მოთხოვნებს ან მიმდინარე სამუშაოს. ერთადერთი შესაფერისი წევრის განმეორებით არჩევა კვლავ შესაძლებელია; სკრიპტი მას ექსკლუზიურად არ იტოვებს.

შეინარჩუნეთ დასაშვებობა აუზის ჯანმრთელობისა და პოლიტიკის წესებით. თუ წევრს ამოიღებთ და მოგვიანებით აღადგენთ, გადაწყვიტეთ შენარჩუნდეს თუ არა მისი ისტორიული რაოდენობა. აღდგენილი პროქსის ნულიდან დაწყებამ შეიძლება განაწილებები მასზე მოახდინოს კონცენტრაცია, სანამ დაეწევა.

უმცირესი ერთდროულობის პოლიტიკას სჭირდება სხვა სასიცოცხლო ციკლი, მათ შორის დასრულება და მიტოვებული სამუშაოების დამუშავება. ნუ განიმარტავთ ამ კუმულაციურ მთვლელს როგორც იმ სასიცოცხლო ციკლს.

დაკავშირებული სტატიები